🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

7055閲覧

Pythonのattributeerrorの改善方法を教えて下さい。

hirahashi

総合スコア38

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/12/30 15:45

前提・実現したいこと

いつもお世話になっております。
Seppe vanden BrouckeとBart Baesens著の『Pythonスクレイピングの基本と実践 データサイエンティストのためのWebデータ収集術』のp91に載っているソースコードを写経して実行しました。内容はスクレイピングの保護対策のためのコードです。
イメージ説明

発生している問題・エラーメッセージ

Traceback (most recent call last):
File "C:/Users/PycharmProjects/sampleproject2/helloworld3.py", line 9, in <module>
p_val = html_soup.find('input', attrs={'name': 'protection'}).get('value')
AttributeError: 'NoneType' object has no attribute 'get'

該当のソースコード

ここに言語名を入力
python
ソースコード
import requests
from bs4 import BeautifulSoup

url = 'http://www.webscrapingfordatascience.com/postform2/'

r = requests.get(url)

html_soup = BeautifulSoup(r.text, 'html.parser')
p_val = html_soup.find('input', attrs={'name': 'protection'}).get('value')

formdata = {
'name': 'Seppe',
'gender': 'M',
'pizza': 'like',
'haircolor': 'brown',
'comments': '',
'protection': p_val
}

試したこと

attributeerrorで初心者がよくするミスが、当エラー行での
関数のスペルミスらしいのでその部分をしっかり見ました。
他にはエラー行に全角が紛れていないかなどを確認いたしました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

attributeError: 'NoneType' object has no attribute 'get'

NoneType とは None のこと。
None には get がありませんよ、というエラー。
None になっているのは html_soup.find('input', attrs={'name': 'protection'}) の部分。
つまり、html_soup の中に input がないか name が protection という項目がなかったということ。

print(html_soup) を実行して、findしようとしてる項目があるか確認してみてはいかがですか?
テキストには postform3 と書いてあるようにみえるけど・・・

>>> import requests >>> from bs4 import BeautifulSoup >>> url = 'http://www.webscrapingfordatascience.com/postform2/' >>> r = requests.get(url) >>> html_soup = BeautifulSoup(r.text, 'html.parser') >>> html_soup <html> <body> <form method="POST"> <table border="1"> <tr style="background-color: #24afe2;"><th>Name</th><th>Value</th></tr> <tr><td>Your name</td> <td><input name="name" type="text"/></td></tr> <tr><td>Your gender</td> <td><input name="gender" type="radio" value="M"/>Male<br/> <input name="gender" type="radio" value="F"/>Female<br/> <input name="gender" type="radio" value="N"/>Other / prefer not to say</td></tr> <tr><td>Food you like</td> <td><input name="pizza" type="checkbox" value="like"/>Pizza!<br/> <input name="fries" type="checkbox" value="like"/>Fries please<br/> <input name="salad" type="checkbox" value="like"/>Salad for me</td></tr> <tr><td>Your hair color</td> <td> <select name="haircolor"> <option value="black">Black hair</option> <option value="brown">Brown hair</option> <option value="blonde">Blonde hair</option> <option value="other">Other</option> </select> </td></tr> <tr><td>Any more comments?</td> <td> <textarea name="comments"></textarea> </td></tr> <tr><td>Ready?</td> <td> <input type="submit" value="Submit my information"/> </td></tr> </table> </form> </body> </html> >>> x = html_soup.find('input', attrs={'name':'protocol'}) >>> print(x) None >>> x = html_soup.find('input') >>> print(x) <input name="name" type="text"/>

投稿2019/12/30 16:08

編集2019/12/30 16:18
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirahashi

2019/12/30 16:18

ご回答ありがとうございます。 URLの最期は2ではなく3でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問