【问题标题】:KeyError in BeautifulSoup page crawlingBeautifulSoup 页面抓取中的 KeyError
【发布时间】:2016-04-01 16:34:43
【问题描述】:

我正在编写一个涉及抓取某些固定网站的小应用程序。在这种情况下,我正在爬取 TechCrunch,但我被卡住了,因为我得到了一个 KeyError,而我真的不应该这样做。

这是执行爬取的代码部分:

response = urllib.request.urlopen(self.url)
soup = BeautifulSoup(response.read(), "html.parser")

chunks = soup.find_all('li', class_='river-block')
html = 'TechCrunch:'
html += '<ul>'
for c in chunks:
    print(c.attrs.keys())
    print(c.attrs.values())
    html += '<li>'
    html += c.attrs['data-sharetitle']
    html += '<a href="' + c.attrs['data-permalink'] + '">Read more</a>'
    html += '</li>'
    html += '</ul>'

这个想法是链接和标题分别存储在data-permalinkdata-sharetitle属性中。现在,两个打印语句的输出是我所期望的:

dict_keys(['class', 'data-sharetitle', 'id', 'data-shortlink', 'data-permalink'])
dict_values([['river-block', 'crunch-network'], 'Investing In Artificial\xa0Intelligence', '1251865', 'http://tcrn.ch/1mEbmcG', 'http://techcrunch.com/2015/12/25/investing-in-artificial-intelligence/'])

但是,html += c.attrs['data-sharetitle'] 行给了我KeyError: 'data-sharetitle'。为什么?

【问题讨论】:

    标签: python html python-3.x beautifulsoup html-parsing


    【解决方案1】:

    并非每个具有river-block 类的li 元素都具有data-sharetitle 属性。 强制存在所需的属性。替换:

    chunks = soup.find_all('li', class_='river-block')
    

    与:

    chunks = soup.find_all('li', {"class": "river-block", 
                                  "data-sharetitle": True, 
                                  "data-permalink": True})
    

    【讨论】:

    • 谢谢!粗略一看,每个li 都有river-block 类,但我现在注意到li 中还有其他li
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2019-10-27
    相关资源
    最近更新 更多