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