プロが教えるわが家の防犯対策術!

Pythonで以下のプログラムを書いたのですが、
from bs4 import BeautifulSoup
import requests
game_ranking_html = requests.get('http://www.amazon.co.jp/gp/new-releases/videogam …
soup = BeautifulSoup(game_ranking_html.text,"html.parser")
print(soup.find(class_='zg_itemRow').find(class_='zg_title').find('a').string)
print('')

for game in soup.findAll(class_='zg_itemRow'):
print(game.find(class_='zg_rankNumber').string + game.find(class_='zg_title').find('a').string)
を実行すると、
Traceback (most recent call last):
File "C:\Users\Hiroaki Sakakida\Desktop\Practice\Practice\chap6-4.py", line 26, in <module>
soup.find(class_='zg_itemRow').find(class_='zg_title').find('a').string
AttributeError: 'NoneType' object has no attribute 'find'
と出力され、どうすればよいか分かりません。ネットで調べても分かりませんでした。
このエラーが起きないよう、解決策を教えてください。

質問者からの補足コメント

  • うーん・・・

    ご指摘の通り、一つずつfindを実行(.string付き)した結果、find(class_='zg_itemRow')とfind('a')はNoneを返してきましたが、find(class_='zg_title')は
    Traceback (most recent call last):
    File "C:\Users\Hiroaki Sakakida\Desktop\Practice\Practice\chap6-4.py", line 26, in <module>
    print(soup.find(class_='zg_title').string)
    AttributeError: 'NoneType' object has no attribute 'string'
    となったので、stringを外すと、Noneが返ってきました。どうすればいいでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/06/20 00:13
  • SBクリエイティブ株式会社発行、鎌田正浩著の「確かな力が身につくPython「超」入門」という本の240ページのPythonで外部ライブラリを使ってプログラミングする練習するための実行コードを実行した結果、エラーが出たというわけです。2016年8月27日発行のものなので、ご指摘の通り、HTMLの構造が現在と異なっている可能性が考えられます。そこで、HTMLの解析法などを追記していただけると助かります。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/06/21 01:14

A 回答 (3件)

何を目的にどうやろうとしたのか、私にはわかりません。



プログラムを眺める限り、アマゾンのなんかのページから情報を取り出して表示させようとしているのがわかるくらいです。
そのページのHTMLをBeautifulSoupで解析して、取り出したい情報を取り出しているのでしょう。

ただ、この手のサイトはちょくちょくHTMLの構造が変更されます。
そのプログラムが、どこかからコピーしたものだったりしたら、class名等は過去のもので、現在は使えない、あるいは構造が変化している、ということが考えられます。

ですから、現状に合うように、ご自身でHTMLを解析したり検索方法を変えたりしてください、としか言いようがありません。
この回答への補足あり
    • good
    • 1

あなたはどうしたいんですか?

    • good
    • 0

メッセージの内容を理解しましょう。



Noneオブジェクトに対して find メソッドを使おうとしているのが、このエラーの理由です。

https://www.crummy.com/software/BeautifulSoup/bs …
によると、findは見付からない場合に Noneを返す、とあります。
例えば
zg_itemRow が見つからなくて soup.find(class_='zg_itemRow') が Noneを返す
→ soup.find(class_='zg_itemRow') ,findfind(class_='zg_title') が None.find(class_='zg_title') の意味になる
→ Noneには findメソッドが無い
といったことが起ります。

一つずつfindがNoneを返していないか確認する必要はあるかと思います。
ですが、それ以上の具体的な修正方法はわかりません。

プログラムに間違いがあって見つからないのか
そもそも無いものを探そうとしているのか
といった判断ができません。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!