Возможные дубликаты:
Как вы конвертируете объекты HTML в Unicode и наоборот в Python?
Возможные дубликаты:
Как вы конвертируете объекты HTML в Unicode и наоборот в Python?
Вам нужно BeautifulSoup.
from BeautifulSoup import BeautifulStoneSoup
import cgi
def HTMLEntitiesToUnicode(text):
"""Converts HTML entities to unicode. For example '&' becomes '&'."""
text = unicode(BeautifulStoneSoup(text, convertEntities=BeautifulStoneSoup.ALL_ENTITIES))
return text
def unicodeToHTMLEntities(text):
"""Converts unicode to HTML entities. For example '&' becomes '&'."""
text = cgi.escape(text).encode('ascii', 'xmlcharrefreplace')
return text
text = "&, ®, <, >, ¢, £, ¥, €, §, ©"
uni = HTMLEntitiesToUnicode(text)
htmlent = unicodeToHTMLEntities(uni)
print uni
print htmlent
# &, ®, <, >, ¢, £, ¥, €, §, ©
# &, ®, <, >, ¢, £, ¥, €, §, ©
Что касается "наоборот" (который мне нужен был, что побудило меня найти этот вопрос, который не помог, а впоследствии другой сайт, который ответ):
u'some string'.encode('ascii', 'xmlcharrefreplace')
вернет простую строку с любыми символами без ascii, превращенными в объекты XML (HTML).
Обновление для Python 2.7 и BeautifulSoup4
Unescape - Unicode HTML для unicode с htmlparser
(стандартная библиотека Python 2.7):
>>> escaped = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood'
>>> from HTMLParser import HTMLParser
>>> htmlparser = HTMLParser()
>>> unescaped = htmlparser.unescape(escaped)
>>> unescaped
u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood'
>>> print unescaped
Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood
Unescape - Unicode HTML для юникода с bs4
(BeautifulSoup4):
>>> html = '''<p>Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood</p>'''
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(html)
>>> soup.text
u'Monsieur le Cur\xe9 of the \xabNotre-Dame-de-Gr\xe2ce\xbb neighborhood'
>>> print soup.text
Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood
Escape - Unicode для Unicode HTML с bs4
(BeautifulSoup4):
>>> unescaped = u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood'
>>> from bs4.dammit import EntitySubstitution
>>> escaper = EntitySubstitution()
>>> escaped = escaper.substitute_html(unescaped)
>>> escaped
u'Monsieur le Curé of the «Notre-Dame-de-Grâce» neighborhood'
Как подсказывает ответ гекевинтрана, вы можете использовать cgi.escape(s)
для кодирования строк, но обратите внимание, что в этой функции кодировка кавычек по умолчанию ложна, и может быть хорошей идеей передать аргумент ключевого слова quote=True
рядом с вашей строкой. Но даже если передать quote=True
, функция не будет избегать одинарных кавычек ("'"
) (из-за этих проблем функция устарела начиная с версии 3.2)
Было предложено использовать html.escape(s)
вместо cgi.escape(s)
. (Новое в версии 3.2)
Также html.unescape(s)
был представлен в версии 3.4.
Итак, в Python 3.4 вы можете:
html.escape(text).encode('ascii', 'xmlcharrefreplace').decode()
для преобразования специальных символов в объекты HTML.html.unescape(text)
для преобразования сущностей HTML обратно в текстовые представления.Если кто-то вроде меня удивляется, почему некоторые номера сущностей (коды), такие как ™ (for trademark symbol), € (for euro symbol)
, не кодируются должным образом, причина в том, что в ISO-8859-1 (он же Windows-1252) эти символы не определены.
Также обратите внимание, что для html5 по умолчанию используется набор символов utf-8, это был ISO-8859-1 для html4
Итак, нам придется как-то обойти это (сначала найти и заменить их)
Ссылка (отправная точка) из документации Mozilla
https://developer.mozilla.org/en-US/docs/Web/Guide/Localizations_and_character_encodings
Я использовал следующую функцию для преобразования unicode, вырванного из файла xls, в html файл, сохраняя специальные символы, найденные в файле xls:
def html_wr(f, dat):
''' write dat to file f as html
. file is assumed to be opened in binary format
. if dat is nul it is replaced with non breakable space
. non-ascii characters are translated to xml
'''
if not dat:
dat = ' '
try:
f.write(dat.encode('ascii'))
except:
f.write(html.escape(dat).encode('ascii', 'xmlcharrefreplace'))
надеюсь, что это кому-то полезно
$ python3 -c "
> import html
> print(
> html.unescape('&©—')
> )"
&©—
$ python2 -c "
> from HTMLParser import HTMLParser
> print(
> HTMLParser().unescape('&©—')
> )"
&©—