Декодировать объекты HTML в строку Python?
Я разбираю немного HTML с Beautiful Soup 3, но он содержит HTML-сущности, которые Beautiful Soup 3 автоматически не декодирует для меня:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<p>£682m</p>")
>>> text = soup.find("p").string
>>> print text
£682m
Как я могу декодировать HTML-объекты в text
получить "£682m"
вместо "£682m"
,
8 ответов
Python 3.4+
HTMLParser.unescape
устарела и должна была быть удалена в 3.5, хотя была оставлена по ошибке. Это будет удалено из языка в ближайшее время. Вместо этого используйте html.unescape()
:
import html
print(html.unescape('£682m'))
см. https://docs.python.org/3/library/html.html
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 управляет преобразованием сущностей. В Beautiful Soup 3 вам нужно будет указать convertEntities
аргумент 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
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>
У меня была аналогичная проблема с кодировкой. Я использовал метод normalize(). Я получал ошибку Unicode, используя метод pandas .to_html() при экспорте моего фрейма данных в файл.html в другом каталоге. В итоге я сделал это, и это сработало...
import unicodedata
Объект dataframe может быть любым, назовем его таблицей...
table = pd.DataFrame(data,columns=['Name','Team','OVR / POT'])
table.index+= 1
закодировать данные таблицы, чтобы мы могли экспортировать их в файл.html в папке шаблонов (это может быть любое место по вашему желанию:))
#this is where the magic happens
html_data=unicodedata.normalize('NFKD',table.to_html()).encode('ascii','ignore')
экспортировать нормализованную строку в файл HTML
file = open("templates/home.html","w")
file.write(html_data)
file.close()
Ссылка: документация unicodedata
import html
myHtml = "<body><h1> How to use html.unescape() in Python </h1></body>"
encodedHtml = html.escape(myHtml)
print("Encoded HTML: ", encodedHtml)
decodedHtml = html.unescape(encodedHtml)
print("Decoded HTML: ", decodedHtml)
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup("<p>£682m</p>")
text = soup.find("p").string
print text
Это, вероятно, здесь не актуально. Но чтобы исключить эти HTML-элементы из всего документа, вы можете сделать что-то вроде этого: (Предположим, document = page и, пожалуйста, простите неаккуратный код, но если у вас есть идеи, как сделать его лучше, я все слышу - я новичок в этот).
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