как отбросить только теги html и извлечь связанный текст в python - PullRequest
1 голос
/ 12 января 2020

Я использую l xml для извлечения текста, связанного с тегами html, но он также обрабатывает все в <> скобках как тег и отбрасывает его. Есть ли способ сохранить все, кроме стандартных тегов html в тексте?

from lxml import html
data="<EXPE>(i)<i>you</i>"
print(html.fragment_fromstring(data).text_content())

Это дает вывод

'(i)you'

Но желаемый вывод будет <Expe>(i)you

Я попробовал то же самое с Прекрасным супом, как показано ниже:

from bs4 import BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')
text = soup.find_all(text=True)
print(text)

Это также отбрасывает

'<Expe>'

в его вывод. У меня есть много текста внутри <>, которые не являются тегами html. так есть ли способ не пропускать их?

1 Ответ

0 голосов
/ 12 января 2020

Pyparsing может обрабатывать теги XML или HTML, когда вы не хотите обязательно создавать полную модель документа, а просто извлекаете или манипулируете текстом здесь и там.

Pyparsing включает makeHTMLTags метод определения выражений сопоставления тегов и anyOpenTag и anyCloseTag выражений, которые будут соответствовать любым тегам XML или HTML.

Простой стриптизер тегов может быть записан с помощью:

>>> import pyparsing as pp
>>> anyHtml = pp.anyOpenTag | pp.anyCloseTag
>>> anyHtml.suppress().transformString(data)

Метод suppress() берет соответствующий текст и подавляет его из проанализированного вывода, а transformString обрабатывает полный ввод, применяя каждое выражение синтаксического анализа.

Передача его в строке образца дает то же самое вывод как BS text() метод:

>>> anyHtml.suppress().transformString(data)
'(i)you'

Но вы можете изменить этот стриппер так, чтобы он пропускал любые теги, которые вы хотите сохранить, сначала проверяя их и отрицая их с помощью '~' (оператор быстрого вызова для pp.NotAny). Определите выражение синтаксического анализа, которое описывает все теги, которые вы не хотите удалить.

>>> keepers = pp.MatchFirst(pp.makeHTMLTags(keeper)[0] for keeper in "EXPE SAVE OTHER".split())

Затем используйте эту отрицательную проверку, чтобы избежать совпадения с вашими тегами для сохранения:

>>> (~keepers + anyHtml).suppress().transformString(data)
'<EXPE>(i)you'
...