如何在BeautifulSoup中修复“ KeyError”错误

时间:2019-10-22 12:10:52

标签: python web-scraping beautifulsoup

我正在学习如何使用BeautifulSoup,并且正在尝试从Google阅读天气。

我使用的网址是: https://www.google.co.uk/search?sxsrf=ACYBGNSfZJRq-EqvQ7rSC0oFZW-FiL-S-Q%3A1571602469929&source=hp&ei=JcCsXb-ANoK4kwWgtK_4DQ&q=what%27s+the+weather+today&oq=whats+the+weather+&gs_l=psy-ab.3.0.0i10i70i256j0i10j0j0i10l3j0l3j0i10.663.2962..4144...0.0..0.82.1251.19......0....1..gws-wiz.....10..35i362i39j35i39j0i131.AWESAgn5njA

我在行上收到“ KeyError:“ id””错误

if span.attrs["id"] == "wob_tm":

这是什么意思,我该如何解决?

我在指定不同的属性“类”时遇到了相同的错误,因此我认为“类”一词可能只是一个问题,但无论使用何种方式,我仍然会收到错误消息

# Creates a list containing all appearences of the 'span' tag
# The weather value is located within a span tag
spans = soup.find_all("span")

for span in spans:

    if span.attrs["id"] == "wob_tm":

        print(span.content)

我希望输出是天气的整数值,但是当我运行代码时,我得到的只是: “ KeyError:'id'”

3 个答案:

答案 0 :(得分:3)

有些span标签根本没有该属性,因此当您尝试访问该标签时,它们会给您错误。您可以完善搜索范围:

spans = soup.find_all('span', {'id': 'wob_tm'})

这只会找到匹配的对象。然后,您可以全部打印它们:

for span in spans:
    print(span.content)

答案 1 :(得分:0)

字典“ attrs”中没有“ id”键的问题。下面的代码将处理这种情况。

spans = soup.find_all("span")
for span in spans:
    if span.attrs.get("id") == "wob_tm":
        print(span.content)
    else:
        print('not wob_tm')

答案 2 :(得分:0)

尽管其余答案是正确的,但在那种情况下都不会起作用,因为温度内容可能是使用javascript加载的,因此找不到您正在寻找的spans。相反,您可以使用肯定有效的selenium。即:

from selenium import webdriver

driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://www.google.co.uk/search?sxsrf=ACYBGNSfZJRq-EqvQ7rSC0oFZW-FiL-S-Q%3A1571602469929&source=hp&ei=JcCsXb-ANoK4kwWgtK_4DQ&q=what%27s+the+weather+today&oq=whats+the+weather+&gs_l=psy-ab.3.0.0i10i70i256j0i10j0j0i10l3j0l3j0i10.663.2962..4144...0.0..0.82.1251.19......0....1..gws-wiz.....10..35i362i39j35i39j0i131.AWESAgn5njA")

temp = driver.find_element_by_id('wob_tm').text
print(temp)