Преобразование HTML-объектов в Юникод и наоборот


возможные дубликаты:

Как конвертировать HTML-объекты в Unicode и наоборот в Python?

6 52

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
# &, ®, <, >, ¢, £, ¥, €, §, ©
# &amp;, &#174;, &lt;, &gt;, &#162;, &#163;, &#165;, &#8364;, &#167;, &#169;

обновление для Python 2.7 и BeautifulSoup4

Unescape -- Unicode HTML в unicode с htmlparser (Python 2.7 standard lib):

>>> escaped = u'Monsieur le Cur&eacute; of the &laquo;Notre-Dame-de-Gr&acirc;ce&raquo; 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&eacute; of the &laquo;Notre-Dame-de-Gr&acirc;ce&raquo; 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&eacute; of the &laquo;Notre-Dame-de-Gr&acirc;ce&raquo; 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 = '&nbsp;'
    try:
        f.write(dat.encode('ascii'))
    except:
        f.write(html.escape(dat).encode('ascii', 'xmlcharrefreplace'))

надеюсь, что это кому-то полезно

Если кто-то вроде меня там интересно, почему некоторые номера сущностей (коды), как &#153; (for trademark symbol), &#128; (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