Декодировать HTML-объекты в строке Python?
я разбираю некоторые HTML с красивым супом 3, но он содержит HTML-объекты, которые красивый суп 3 автоматически не декодирует для меня:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<p>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
как я могу декодировать HTML-объекты в text
и "£682m"
вместо "£682m"
.
5 ответов:
Python 3.4+
HTMLParser.unescape
устарел, и должен был быть удален в 3.5, хотя он был оставлен по ошибке. Он будет удален из языка в ближайшее время. Вместо этого используйтеhtml.unescape()
:import html print(html.unescape('£682m'))
см.https://docs.python.org/3/library/html.html#html.unescape
Python 2.6-3.3
вы можете использовать парсер HTML из стандартной библиотеки:
>>> try: ... # Python 2.6-2.7 ... from HTMLParser import HTMLParser ... except ImportError: ... # Python 3 ... from html.parser import HTMLParser ... >>> h = HTMLParser() >>> print(h.unescape('£682m')) £682m
посмотреть http://docs.python.org/2/library/htmlparser.html
вы также можете использовать
six
библиотека совместимости для упрощения импорта:>>> from six.moves.html_parser import HTMLParser >>> h = HTMLParser() >>> print(h.unescape('£682m')) £682m
красивый суп обрабатывает преобразование сущности. В Beautiful Soup 3 вам нужно будет указать до
BeautifulSoup
конструктора (см. 'Субъект Преобразования' раздел архивных документов). В Beautiful Soup 4 объекты декодируются автоматически.Красивый Суп 3
>>> from BeautifulSoup import BeautifulSoup >>> BeautifulSoup("<p>£682m</p>", ... convertEntities=BeautifulSoup.HTML_ENTITIES) <p>£682m</p>
Красивый Суп 4
>>> from bs4 import BeautifulSoup >>> BeautifulSoup("<p>£682m</p>") <html><body><p>£682m</p></body></html>
вы можете использовать replace_entities из w3lib.HTML-код библиотеки
In [202]: from w3lib.html import replace_entities In [203]: replace_entities("£682m") Out[203]: u'\xa3682m' In [204]: print replace_entities("£682m") £682m
красивый суп 4 позволяет установите форматер для вашего вывода
Если вы проходите в
formatter=None
, красивый суп не будет изменять строки вообще на выходе. Это самый быстрый вариант, но он может привести к Красивый суп, генерирующий недопустимый 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>
Это, вероятно, не имеет отношения здесь. Но чтобы устранить эти HTML-сущности из всего документа, вы можете сделать что - то вроде этого: (предположим, что document = page и, пожалуйста, простите неаккуратный код, но если у вас есть идеи о том, как сделать его лучше, Im all ears-Im new to this).
import re import HTMLParser regexp = "&.+?;" list_of_html = re.findall(regexp, page) #finds all html entites in page for e in list_of_html: h = HTMLParser.HTMLParser() unescaped = h.unescape(e) #finds the unescaped value of the html entity page = page.replace(e, unescaped) #replaces html entity with unescaped value