Вопрос-Ответ

Decode HTML entities in Python string?

Декодировать HTML-объекты в строке Python?

Я разбираю некоторый HTML с помощью Beautiful Soup 3, но он содержит HTML-объекты, которые Beautiful Soup 3 не декодирует для меня автоматически:

>>> from BeautifulSoup import BeautifulSoup

>>> soup = BeautifulSoup("<p>&pound;682m</p>")
>>> text = soup.find("p").string

>>> print text
&pound;682m

Как я могу декодировать HTML-объекты в text, чтобы получить "£682m" вместо "&pound;682m".

Переведено автоматически
Ответ 1

Python 3.4+

Использовать html.unescape():

import html
print(html.unescape('&pound;682m'))

К вашему сведению, html.parser.HTMLParser.unescape устарел и должен был быть удален в версии 3.5, хотя был оставлен по ошибке. Скоро будет удален из языка.


Python 2.6-3.3

Вы можете использовать HTMLParser.unescape() из стандартной библиотеки:

>>> try:
... # Python 2.6-2.7
... from HTMLParser import HTMLParser
... except ImportError:
... # Python 3
... from html.parser import HTMLParser
...
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m

Вы также можете использовать six библиотеку совместимости для упрощения импорта:

>>> from six.moves.html_parser import HTMLParser
>>> h = HTMLParser()
>>> print(h.unescape('&pound;682m'))
£682m
Ответ 2

Beautiful Soup обрабатывает преобразование сущностей. В Beautiful Soup 3 вам нужно будет указать convertEntities аргумент для BeautifulSoup конструктора (см. Раздел "Преобразование сущностей" в архивных документах). В Beautiful Soup 4 сущности декодируются автоматически.

Красивый суп 3

>>> from BeautifulSoup import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>",
... convertEntities=BeautifulSoup.HTML_ENTITIES)
<p>£682m</p>

Красивый суп 4

>>> from bs4 import BeautifulSoup
>>> BeautifulSoup("<p>&pound;682m</p>")
<html><body><p682m</p></body></html>
Ответ 3

Вы можете использовать replace_entities из w3lib.html библиотека

In [202]: from w3lib.html import replace_entities

In [203]: replace_entities("&pound;682m")
Out[203]: u'\xa3682m'

In [204]: print replace_entities("&pound;682m")
£682m
Ответ 4

Beautiful Soup 4 позволяет вам установить форматер для вашего вывода


Если вы передадите команду formatter=None, Beautiful Soup вообще не изменит строки при выводе. Это самый быстрый вариант, но это может привести к тому, что Beautiful Soup сгенерирует недопустимый HTML / XML, как в этих примерах.:


print(soup.prettify(formatter=None))
# <html>
# <body>
# <p>
# Il a dit <<Sacré bleu!>>
# </p>
# </body>
# </html>

link_soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
print(link_soup.a.encode(formatter=None))
# <a href="http://example.com/?foo=val1&bar=val2">A link</a>
python