BeautifulSoup KeyError Issue - PullRequest
       3

BeautifulSoup KeyError Issue

4 голосов
/ 08 марта 2012

Я знаю, что KeyErrors довольно часто встречаются в BeautifulSoup, и, прежде чем на меня нарекать RTFM, я подробно изучил как документацию по Python, так и документацию по BeautifulSoup.Теперь, когда это в стороне, я до сих пор не знаю, что происходит с KeyErrors.

Вот программа, которую я пытаюсь запустить, которая постоянно и последовательно приводит к KeyError на last элемент списка URL-адресов.

Я пришел из C ++, просто чтобы вы знали, но мне нужно использовать BeautifulSoup для работы, выполнение этого в C ++ было бы вообразимым кошмаром!

Идея состоит в том, чтобы вернуть список всех URL на веб-сайте, которые содержат на своих страницах ссылки на определенный URL.

Вот что я получил до сих пор:

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 по умолчанию.Я абсолютно не знаю, не знаю , как на самом деле это сделать, несмотря на буквально час поиска.

Спасибо, если я могу уточнить это, пожалуйста, дайте мне знать.

1 Ответ

5 голосов
/ 08 марта 2012

Если вы просто хотите обработать ошибку, вы можете поймать исключение:

    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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...