我在测试此BeautifulSoup抓取工具时遇到问题。如果有一些明显的错误,请原谅我,因为这是我进入Python的第三个小时。我在下面有这个代码......
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
答案 0 :(得分:1)
看起来news_list
是字典(键值对),并且没有0
的键。如果它是你试图索引的列表,那将会奏效。因此,而不是你的
for news in news_list[0]:
行,试试
for key, news in news_list.iteritems():
这将遍历字典中的每个项目。如果您只想要第一个结果,我不确定您是如何确定的。尝试打印出项目以确定返回的内容。
答案 1 :(得分:1)
问题在于:
news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})[0]
for news in news_list[0]:
只需删除这两个[0]
位中的一个,问题(或者至少是这个问题 - 我无法保证代码的其余部分能够满足您的需求)将会消失。
我不会解释为什么代码错误,因为你真的需要学习调试代码并自己解决这些问题。
首先在交互式解释器中执行此操作:
>>> huff_soup = BeautifulSoup(urllib2.urlopen("http://www.huffingtonpost.com").read())
>>> news_list = huff_soup.find_all("div", {"class", "snp_most_popular_entry"})
查看返回的内容 - 它的形状是什么,以及如何以交互方式获得所需的部分?一旦你知道了,你应该在脚本中明白如何做到这一点。
即使在事情过于复杂而无法以交互方式进行的情况下,您也可以使用print语句记录内容,在调试器中运行等等。不要盲目地盯着不起作用的代码并说“为什么没有”它有用吗?“或者在某处发布代码并问别人为什么它不起作用,或者你永远不会学到任何东西。