我正在使用BeautifulSoup模块以这种方式从html中选择所有href:
def extract_links(html):
soup = BeautifulSoup(html)
anchors = soup.findAll('a')
print anchors
links = []
for a in anchors:
links.append(a['href'])
return links
但有时它会因此错误消息而失败:
Traceback (most recent call last):
File "C:\py\main.py", line 33, in <module>
urls = extract_links(page)
File "C:\py\main.py", line 11, in extract_links
links.append(a['href'])
File "C:\py\BeautifulSoup.py", line 601, in __getitem__
return self._getAttrMap()[key]
KeyError: 'href'
答案 0 :(得分:6)
并非所有锚标记都具有href属性。在尝试访问该属性之前,应检查锚是否有href。
if a.has_key('href')
links.append(a['href'])
在这里查看了一些评论之后,我认为这是处理这种情况的最灵活方式。
答案 1 :(得分:2)
试试这个。
links = [a['href'] for a in anchors if a.has_key('href')]
或者,如果你想改变现有的列表
links = []
#...
links.extend(a['href'] for a in anchors if a.has_key('href'))
答案 2 :(得分:2)
soup.findAll()返回包含属性字典的“标记”列表。因此,您需要提取其属性并对其进行处理。
以你的例子和修改为例,这是有效的代码:
def extract_links(html):
soup = BeautifulSoup(html)
anchors = soup.findAll('a')
print anchors
links = []
for a in anchors:
if a.attrs.has_key('href'):
links.append(a['href'])
return links
答案 3 :(得分:0)
Pythonic的方式是这样的:
for a in anchors:
try:
links.append(a['href'])
except KeyError:
pass
只是在没有href的情况下跳过任何<a>
个标签。
答案 4 :(得分:0)
您需要先将a.attrs
投射到dict
,然后再访问该元素。
links.append(dict(a.attrs)['href'])
答案 5 :(得分:0)
我使用上面的注释,但是出现警告,因此将其更改为has_attr并通过
if i.has_key("href"):
print(i.string, i['href'])
UserWarning:已弃用has_key。改用has_attr(“ href”)。
2.Pass——确定
if i.has_attr("href"):
print(i.string, i['href'])