在调用函数时返回keyerror

时间:2012-12-10 03:11:35

标签: python beautifulsoup

我在测试此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

2 个答案:

答案 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语句记录内容,在调试器中运行等等。不要盲目地盯着不起作用的代码并说“为什么没有”它有用吗?“或者在某处发布代码并问别人为什么它不起作用,或者你永远不会学到任何东西。