Python модуль BeautifulSoup извлекает якоря href - PullRequest
5 голосов
/ 30 января 2012

Я использую модуль BeautifulSoup, чтобы выбрать все href из html следующим образом:

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 ]

6 голосов
/ 30 января 2012

Не все якорные теги будут иметь атрибут href. Прежде чем пытаться получить доступ к этому атрибуту, вы должны проверить, что якорь имеет href.

if a.has_key('href')
  links.append(a['href'])

После проверки некоторых комментариев я думаю, что это самый питонический способ рассмотрения этого дела.

2 голосов
/ 28 сентября 2013

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
2 голосов
/ 30 января 2012

Попробуйте это.

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'))
0 голосов
/ 11 июля 2019
  1. Я использую комментарий выше, но появляется предупреждение, поэтому я заменяю его has_attr и передаю

    if i.has_key("href"):
        print(i.string, i['href'])
    

    UserWarning: has_key устарелаВместо этого используйте has_attr ("href").

2.Pass —— OK

if i.has_attr("href"):
    print(i.string, i['href'])
0 голосов
/ 31 января 2012

Сначала необходимо привести a.attrs к dict, затем получить доступ к элементу.

links.append(dict(a.attrs)['href'])
0 голосов
/ 30 января 2012

Pythonic путь будет выглядеть примерно так:

for a in anchors:
    try:
        links.append(a['href'])
    except KeyError:
        pass

Это просто пропускает любые <a> теги без href.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...