BeautifulSoup KeyError问题

Jam*_*man 4 python beautifulsoup

我知道KeyErrors在BeautifulSoup中相当普遍,在你向我大喊RTFM之前,我已经在Python文档和BeautifulSoup文档中做了大量的阅读.现在,除此之外,我仍然不知道KeyErrors正在发生什么.

这是我正在尝试运行的程序,它始终如一地导致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]) 
Run Code Online (Sandbox Code Playgroud)

我得到的错误是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'   
Run Code Online (Sandbox Code Playgroud)

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

谢谢,如果我能澄清一下,请告诉我.

Edu*_*nec 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
Run Code Online (Sandbox Code Playgroud)

您可以使用指定默认值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)
Run Code Online (Sandbox Code Playgroud)

另外,check_list(item, l)可以替换为item in l.