BeautifulSoup: поиск в атрибуте .text - PullRequest
0 голосов
/ 31 декабря 2018

У меня следующая ситуация

from bs4 import BeautifulSoup
html = '''<span class='generic'><span>Hey</span><span>Joe</span></span>'''
soup = BeautifulSoup(html, 'lxml')
tag = soup.find('span', text="HeyJoe")
print(tag)

Какая печать None.

Но если я запускаю

soup.find('span', text="Hey").parent.text

, он возвращает HeyJoe, поэтому он возвращает «полный» текст, включая детский текст.Я полагал, что параметр text= функции find() также будет искать в «полном» тексте, то есть в теге .text.

Мне нужно найти родительский тег span(класс с классом generic).

Я хотел бы сделать это, вызвав функцию BeautifulSoup, которая выполняет поиск в элементе .text.Так что он будет объединять текст во всех дочерних тегах перед поиском.Есть ли такая функция?

  1. Я не могу использовать класс для поиска тега, потому что в реальном случае это очень общий класс, широко используемый многими тегами
  2. Я не хотел бы искать детей span с текстом Hey, а затем извлекать родительский элемент, поскольку в реальном случае это также довольно типично.

Нет ли способаискать в атрибуте .text элемента?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете попробовать использовать ниже, чтобы найти span узел по полному текстовому содержимому "HeyJoe":

tag = [span for span in soup.findAll('span') if span.text == "HeyJoe"][0]
0 голосов
/ 31 декабря 2018

Из вашей формулировки не совсем понятно, что вы пытаетесь сделать.

Если вы хотите найти конкретный шаблон, вы можете использовать re.compile и передать его непосредственноАргумент ключевого слова BeautifulSoup text=, например,

soup.find("span", text=re.compile("Hey"))

. Он вернется для первого экземпляра строки "Hey" в любом теге span на странице, если таковой имеется.Если вы хотите, чтобы регистр не учитывался, используйте:

soup.find("span", text=re.compile("Hey", re.IGNORECASE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...