前提・実現したいこと
教本をみながらスクレイピング練習中なのですが、
自分のコードでは動きません。
「どこが間違っているか」はわかるのですが、
「なぜ間違っているのか」教えていただきたいです。
課題内容
練習用サイトアクセスし、
以下の<div>に含まれる、<a>タグで囲われた文字列を抽出して出力する
<div class="list-group"> <a href="#" class="list-group-item" data-slimstat="5">トップページ</a><br> <a href="/company" class="list-group-item" data-slimstat="5">会社案内</a><br> <a href="/company/greeting" class="list-group-item" data-slimstat="5">代表挨拶</a><br> <a href="/services/advisory_engineer" class="list-group-item" data-slimstat="5">顧問エンジニアによるITコンサルティング</a><br> <a href="/services/handy" class="list-group-item" data-slimstat="5">展示会の注文管理サービス Handy</a><br> <a href="/services/mod99" class="list-group-item" data-slimstat="5">業務システム自動生成フレームワーク MOD99</a><br> <a href="/category/advisory_engineer_column" class="list-group-item" data-slimstat="5">IT活用虎の巻</a><br> <a href="/dokushu-python-support" class="list-group-item" data-slimstat="5">独習Python入門サポートページ</a><br> <a href="/contact" class="list-group-item" data-slimstat="5">お問い合わせ</a> </div>
提示された手順
①divタグを抽出する
②divタグに囲われている、全てのaタグを配列で抽出する
③②で取得した配列を繰り返し処理で出力
###教本での解法
Python
1import urllib.request 2from bs4 import BeautifulSoup 3 4req = urllib.request.urlopen("https://quality-start.in/company/") 5soup = BeautifulSoup(req, "html.parser") 6side_menu = soup.find("div", class_="list-group") 7 8for a_tags in side_menu.find_all("a"): 9 print(a_tags.string)
自分が書いたコード
Python
1import urllib.request 2from bs4 import BeautifulSoup 3 4req = urllib.request.urlopen("https://quality-start.in/company/") 5soup = BeautifulSoup(req, "html.parser") 6side_menu = soup.find("div", class_="list-group") 7 8items = side_menu.find_all("a").string 9 10for i in items: 11 print(i)
聞きたいこと
自分のコードでは、aタグをitemsという配列に一旦格納してから、for文で出力している(つもり)で、
教本は、配列に名前をつけず、直接for文に突っ込んで出力している、といったところでしょうか。
自分のコードではこのようなエラーが出てしまい、実行されません。
Traceback (most recent call last): File "do_scraping.py", line 8, in <module> items = side_menu.find_all("a").string File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/bs4/element.py", line 1620, in __getattr__ "ResultSet object has no attribute '%s'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?" % key AttributeError: ResultSet object has no attribute 'string'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?
①なぜこのようなことが起こるのでしょうか
②もし、自分のコードのように、aタグの中身を配列として変数に代入する場合、どのように書かなければいけなかったのでしょうか
教えていただけると嬉しいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/21 09:26
2019/01/21 09:33 編集
2019/01/21 14:31
2019/01/21 14:51