Игнорировать дочерние узлы при поиске регулярного выражения - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу идентифицировать точку разделения в большом текстовом документе с BeautifulSoup.Поэтому я сформулировал регулярное выражение, чтобы найти тег, в котором встречается конкретная строка.Проблема в том, что он не работает, если в строке, которую я ищу, есть дополнительные узлы / дочерние узлы.

t1 = BeautifulSoup("<p class=\"p p8\"><strong>Question-And-Answer</strong></p>")

t2 = BeautifulSoup("<p class=\"p p8\"><strong>Question</strong>-<strong>And</strong>-<strong>Answer</strong></p>")

t1.find(text = re.compile("Question[s]*-And-Answer[s]*", re.IGNORECASE))
>>> 'Question-And-Answer'

t2.find(text = re.compile("Question[s]*-And-Answer[s]*", re.IGNORECASE))
>>> None

Выходные данные должны быть тегами p.

1 Ответ

0 голосов
/ 07 февраля 2019

Проблема, с которой вы столкнулись, заключается в том, что искомый текст разделяется тегами strong внутри узла p, и поэтому поиск по регулярному выражению с использованием аргумента text в .find не будет работать.это то, как это реализовано в BS.

Если вы знаете, что тексты находятся в p узлах , вы можете использовать лямбда-выражение в вызове .find и выполнить регулярное выражениевыполните поиск по свойству text каждого тега p, чтобы найти нужные элементы:

print(t2.find(lambda t: t.name == "p" and re.search(r'Questions*-And-Answers*', t.text)))
# => <p class="p p8"><strong>Question</strong>-<strong>And</strong>-<strong>Answer</strong></p>

Обратите внимание, что [s] совпадает с s в регулярном выражении.

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