1

この BeautifulSoup クローラーのテストで問題が発生しています。Python を始めて 3 時間目なので、明らかな間違いがあればご容赦ください。私はこのコードを以下に持っています...

def huffpost_crawl():
 article_list = []
 DOMAIN = 'huffingtonpost.com'
 huff_soup = BeautifulSoup(urllib2.urlopen("http://www.huffingtonpost.com").read())
 news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})[0]
 for news in news_list[0]:
    title = news('div', {'class', 'snp_most_popular_entry_desc'})[0].a.get_text()
    full_url = news('div', {'class', 'snp_most_popular_entry_image'}).a["href"]
    blurb = ""
    thumb_url = news('div', {'class', 
   'snp_most_popular_entry_image'}).a.img["longdesc"]


 print title

huffpost_crawl()

ターミナルで実行するpythong test.pyと、次のように返されます...

Traceback (most recent call last):
  File "test.py", line 21, in <module>
  huffpost_crawl()
File "test.py", line 11, in huffpost_crawl
  for news in news_list[0]:
File "/usr/local/lib/python2.7/site-packages/bs4/element.py", line 879, in __getitem__
  return self.attrs[key]
KeyError: 0
4

2 に答える 2

1

は辞書 (キーと値のペア) のように見えnews_list、 のキーがありません0。インデックスを作成しようとしているリストであれば、うまくいきました。したがって、あなたの代わりに

for news in news_list[0]:

行、試してください

for key, news in news_list.iteritems():

これにより、辞書内の各項目が反復処理されます。最初の結果だけが必要な場合は、それをどのように判断するかわかりません。アイテムを印刷して、何が返されるかを確認してください。

于 2012-12-10T03:15:52.060 に答える
1

問題は次のとおりです。

news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})[0]
for news in news_list[0]:

これらの 2 つのビットのうちの 1 つを削除するだけで[0]、問題 (または少なくともこの問題 — コードの残りの部分が意図したとおりに動作することを保証できません) は解消されます。

コードが間違っていた理由については説明しません。なぜなら、コードをデバッグし、自分でこれを理解する方法を本当に学ぶ必要があるからです。

対話型インタープリターでこれを行うことから始めます。

>>> huff_soup = BeautifulSoup(urllib2.urlopen("http://www.huffingtonpost.com").read())
>>> news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})

それが何を返すかを確認してください — それはどのような形で、どのようにしてインタラクティブに必要な部分に到達するのでしょうか? それがわかれば、スクリプトでそれを行う方法は明らかです。

インタラクティブに操作するには複雑すぎる場合でも、print ステートメントを使用してログに記録したり、デバッガーで実行したりできます。 ?」、またはコードをどこかに投稿して、他の人にそれが機能しない理由を尋ねてください。そうしないと、何も学べません.

于 2012-12-10T04:14:07.143 に答える