BeautifulSoup 页面抓取中的 KeyError
KeyError in BeautifulSoup page crawling
我正在编写一个涉及抓取某些固定网站的小应用程序。在这种情况下,我正在抓取 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>'
想法是 link 和标题分别存储在 data-permalink
和 data-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'
。为什么?
并非每个具有 river-block
class 的 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})
我正在编写一个涉及抓取某些固定网站的小应用程序。在这种情况下,我正在抓取 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>'
想法是 link 和标题分别存储在 data-permalink
和 data-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'
。为什么?
并非每个具有 river-block
class 的 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})