красивый суп, получающий href на основе текста - PullRequest
5 голосов
/ 06 января 2012

Скажем, есть страница с сотнями ссылок, каждая с уникальным текстом в теге. Как я могу указать текст тега, а затем получить href оттуда? Например,

for a in soup.findAll('a', href=True):
  print(a['href'])

Это получает всю информацию по всей странице, что является излишним. Когда я делаю это:

for a in soup.findAll('a', href=True text="Some Value"):
  print(a['href'])

Я не могу получить тег href, потому что он больше не возвращает объект Tag, а вместо этого объект Navigable. Есть идеи, как мне добиться того, чего я хочу?

Ответы [ 3 ]

4 голосов
/ 06 января 2012

Вместо передачи параметра text вы можете передать вызываемое значение как параметр name, который проверяет тег name и text:

for tag in soup.findAll(lambda tag: (tag.name == 'a'
                                     and tag.text == 'Some Value'),
                        href=True):
    print tag['href']

Таким образом, возвращаемое значение равно Tag вместо NavigableString.

Обратите внимание, что согласно документации:

Если вы используете текст, то любые значения, которые вы указываете для имени и аргументов ключевого слова, игнорируются.

Так что, вероятно, второй пример в вашем вопросе не работает должным образом, даже если вы просто хотите получить NavigableString.

1 голос
/ 06 января 2012

Вы можете сделать, по крайней мере, что-то вроде:

for a in soup.findAll('a', href=True):
    if self.tag_to_string(a) == "Some Value":
        print(a['href'])    

Но есть и другие способы.

HTH

0 голосов
/ 10 апреля 2015

Это сработало для меня, когда я искал 'See all' в начале текста в теге:

for tag in soup.findAll(lambda tag: (tag.name == 'a' and re.search('^See all',tag.text)), href=True):
    print 'href: ', tag['href']

for a in soup.findAll('a', href=True):
    if re.search('^See all',a.text):
        print 'href: ',(a['href'])      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...