Python模块BeautifulSoup提取锚点href

时间:2012-01-29 23:37:47

标签: python html beautifulsoup

我正在使用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'

6 个答案:

答案 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)

  1. 我使用上面的注释,但是出现警告,因此将其更改为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'])