BeautifulSoup4 не может найти тег «a» при поиске текста - PullRequest
0 голосов
/ 02 мая 2018

Пример HTML

<a class="accordion-item__link" href="/identity-checking/individual"><!-- react-text: 178 -->Australia<!-- /react-text --></a>

Когда я бегу

soup.find("a", text="Australia")

ничего не возвращает.

Если я бегу soup.find("a", href="/identity-checking/individual") находит тег.
soup.find("a", href="/identity-checking/individual").text также возвращает «Австралия»

это как-то связано с комментариями?

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

По какой-то причине обнаружение текста тега переворачивается при наличии комментария xml.

Вы можете использовать это в качестве обходного пути:

[ele for ele in soup('a') if ele.text == 'Australia']
0 голосов
/ 02 мая 2018

Я пытаюсь найти метод, который придерживается метода find, так как он наиболее удобный и адаптируемый. Проблема в том, что комментарии HTML портят движок. Удаление комментариев вручную было бы полезно.

from bs4 import BeautifulSoup, Comment

bs = BeautifulSoup(
    """
    <a class="accordion-item__link" href="/identity-checking/individual"><!-- react-text: 178 -->Australia<!-- /react-text --></a>
    """,
    "lxml"
)
# find all HTML comments and remove
comments = bs.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]

r = bs.find('a', text='Australia')
print(r)
#  <a class="accordion-item__link" href="/identity-checking/individual">Australia</a>

Отсюда появился метод удаления комментариев Как я могу удалить теги комментариев из HTML, используя BeautifulSoup?

Если комментарии должны быть сохранены, вы можете поработать над копией супа.

0 голосов
/ 02 мая 2018

Попробуйте извлечь текст после нахождения тега, то есть:

result = ""
for tag in soup.find_all('a'):
    if tag.text == "Australia":
        result = tag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...