Преобразование HTML-объектов в Юникод и наоборот
возможные дубликаты:
Как конвертировать HTML-объекты в Unicode и наоборот в Python?
6 ответов:
Что касается "наоборот" (который мне нужен был сам, заставляя меня найти этот вопрос, который не помог, а впоследствии другой сайт, который получила ответ):
u'some string'.encode('ascii', 'xmlcharrefreplace')
вернет простую строку с любыми символами, отличными от ascii, превращенными в сущности XML (HTML).
вы должны иметь 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 # &, ®, <, >, ¢, £, ¥, €, §, © # &, ®, <, >, ¢, £, ¥, €, §, ©
обновление для Python 2.7 и BeautifulSoup4
Unescape -- Unicode HTML в unicode с
htmlparser
(Python 2.7 standard lib):>>> 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 в unicode с
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'
как hekevintran ответ предполагает, что вы можете использовать
cgi.escape(s)
для кодирования укусов, но обратите внимание, что кодировка цитаты по умолчанию ложна в этой функции, и может быть хорошей идеей передатьquote=True
аргумент ключевого слова рядом с вашей строкой. Но даже пройдяquote=True
, функция не будет экранировать одинарные кавычки ("'"
) (из-за этих проблем функция устаревший начиная с версии 3.2)было предложено использовать из
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-объектов обратно в текстовые представления.
я использовал следующую функцию для преобразования unicode ripped из файла 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'))
надеюсь, что это кому-то полезно
Если кто-то вроде меня там интересно, почему некоторые номера сущностей (коды), как
™ (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