2012-03-08 211 views
3

我知道KeyErrors与BeautifulSoup相当常见,并且在您向我致敬RTFM之前,我已经在Python文档和BeautifulSoup文档中做了大量的阅读。现在,除了KeyErrors之外,我仍然不知道发生了什么。BeautifulSoup KeyError问题

下面是我试图运行的程序,它不断地持续导致URL列表中的最后一个元素出现KeyError。

我来自C++的背景,只是为了让你知道,但我需要使用BeautifulSoup的工作,这样做在C++将是一个可想而知的噩梦!

这个想法是返回一个网站中所有网址的列表,这些网址在其网页上包含指向某个网址的链接。

这里就是我有这么远:

import urllib 
from BeautifulSoup import BeautifulSoup 

URLs = [] 
Locations = [] 
URLs.append("http://www.tuftsalumni.org") 

def print_links (link): 
    if (link.startswith('/') or link.startswith('http://www.tuftsalumni')): 
     if (link.startswith('/')): 
      link = "STARTING_WEBSITE" + link 
     print (link) 
     htmlSource = urllib.urlopen(link).read(200000) 
     soup = BeautifulSoup(htmlSource) 
     for item in soup.fetch('a'): 
      if (item['href'].startswith('/') or 
       "tuftsalumni" in item['href']): 
       URLs.append(item['href']) 
      length = len(URLs) 
      if (item['href'] == "SITE_ON_PAGE"): 
       if (check_list(link, Locations) == "no"): 
        Locations.append(link) 



def check_list (link, array): 
    for x in range (0, len(array)): 
     if (link == array[x]): 
      return "yes" 
    return "no" 

print_links(URLs[0]) 

for x in range (0, (len(URLs))): 
    print_links(URLs[x]) 

我得到的错误是在旁边的URL的最后一个元素:

File "scraper.py", line 35, in <module> 
    print_links(URLs[x]) 
    File "scraper.py", line 16, in print_links 
    if (item['href'].startswith('/') or 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site- packages/BeautifulSoup.py", line 613, in __getitem__ 
    return self._getAttrMap()[key] 
KeyError: 'href' 

现在我知道我需要使用get( )来处理KeyError默认情况。我绝对有不知道如何真正做到这一点,尽管一个小时的搜索。

谢谢,如果我可以澄清这一点,请让我知道。

回答

5

如果你只是想处理错误,你可以捕获该异常:

for item in soup.fetch('a'): 
     try: 
      if (item['href'].startswith('/') or "tuftsalumni" in item['href']): 
      (...) 
     except KeyError: 
      pass # or some other fallback action 

您可以指定使用item.get('key','default')默认的,但我不认为这是你在这种情况下所需要的。

编辑:如果一切都失败了,这是一个准系统版本,这应该是一个合理的起点:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import urllib 
from BeautifulSoup import BeautifulSoup 

links = ["http://www.tuftsalumni.org"] 

def print_hrefs(link): 
    htmlSource = urllib.urlopen(link).read() 
    soup = BeautifulSoup(htmlSource) 
    for item in soup.fetch('a'): 
     print item['href'] 

for link in links: 
    print_hrefs(link) 

此外,check_list(item, l)可以通过item in l更换。

+0

我想我仍然对发生keyError时发生了什么感到困惑,所以我不知道该如何处理'除了KeyError'段...我真的应该通过它还是会忽略一个可行的网址是什么? – 2012-03-08 00:20:20

+0

非常感谢,它像一个魅力工作!这是否意味着BeautifulSoup像字典一样使用item ['href']?感谢您的帮助,而不仅仅是尖叫“RTFM”! – 2012-03-08 00:31:44

+1

老实说,我不确定问题是什么,我很抱歉。由于其他错误,您的版本无法正常工作,而我尝试的简单版本(仅处理网站主页)就能正常工作。也许你可以从这个简单的例子开始工作吗? – 2012-03-08 00:31:49