Beautifulsoup html parser иногда лишает простого символа амперсанда - PullRequest
0 голосов
/ 08 ноября 2019

В настоящее время я настраиваю конвейер обработки данных, в котором ответы на опрос импортируются из базы данных. Некоторая часть импортированного контента находится в формате HTML, который мне нужно последовательно вырезать и преобразовать в обычный текст, но контент не на 100% согласован. В частности, специальные символы иногда не экранированы, и иногда я получаю их как экранированные коды HTML.

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

Например, этот код:

BeautifulSoup('R&D', features="html.parser").get_text()

приводит к:

'RD'

что я ожидаю:

'R&D'

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

с html.parser - In HTML, the ampersand character (“&”) declares the beginning of an entity reference (a special character). If you want one to appear in text on a web page you should use the encoded named entity “&”

Таким образом, когда он анализирует его без тегов / как сущность, он увидит это как ссылку на сущность:

html = 'R&D'
soup = BeautifulSoup(html, features="html.parser")

print (soup)

Так что выдает результатRD

Однако, если это содержимое / текст внутри тега, он распознает & как закодированный символ:

html = '<span>R&D</span>'
soup = BeautifulSoup(html, features="html.parser")

print (soup)

Вывод равен <span>R&amp;D</span>, поэтому, когдавы делаете soup.text, он будет правильно отображать R&D

1 голос
/ 08 ноября 2019

Используйте lxml вместо html.parser

soup=BeautifulSoup('R&D', features="lxml").get_text()
print(soup)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...