Конвертировать сущности HTML в Unicode и наоборот - PullRequest
59 голосов
/ 31 марта 2009

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

Как преобразовать сущности HTML в Unicode и наоборот в Python?

Ответы [ 6 ]

89 голосов
/ 17 апреля 2010

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

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

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

28 голосов
/ 31 марта 2009

Вам нужно иметь 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;
19 голосов
/ 03 марта 2015

Обновление для 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 в 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'
8 голосов
/ 09 июля 2014

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

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

1 голос
/ 17 мая 2017

Я использовал следующую функцию для преобразования 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'))

надеюсь, это кому-нибудь пригодится

...