Подтвердить что ты не робот

Преобразование объектов HTML в Unicode и наоборот

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

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

4b9b3361

Ответ 1

Вам нужно 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;

Ответ 2

Что касается "наоборот" (который мне нужен был, что побудило меня найти этот вопрос, который не помог, а впоследствии другой сайт, который ответ):

u'some string'.encode('ascii', 'xmlcharrefreplace')

вернет простую строку с любыми символами без ascii, превращенными в объекты XML (HTML).

Ответ 3

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

Unescape - Unicode HTML для unicode с htmlparser (стандартная библиотека Python 2.7):

>>> 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 для юникода с 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'

Ответ 4

Как подсказывает ответ гекевинтрана, вы можете использовать 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 обратно в текстовые представления.

Ответ 5

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

Ответ 6

Я использовал следующую функцию для преобразования 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 = '&nbsp;'
    try:
        f.write(dat.encode('ascii'))
    except:
        f.write(html.escape(dat).encode('ascii', 'xmlcharrefreplace'))

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

Ответ 7

$ python3 -c "
> import html
> print(
>     html.unescape('&amp;&#169;&#x2014;')
> )"
&©—

$ python2 -c "
> from HTMLParser import HTMLParser
> print(
>     HTMLParser().unescape('&amp;&#169;&#x2014;')
> )"
&©—