Возможные дублирует:Преобразование HTML сущности в Unicode и наоборот
Как преобразовать HTML сущности в Юникод и наоборот в Python ?
Возможные дублирует:Преобразование HTML сущности в Unicode и наоборот
Как преобразовать HTML сущности в Юникод и наоборот в 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
# &, ®, <, >, ¢, £, ¥, €, §, ©
# &, ®, <, >, ¢, £, ¥, €, §, ©
Как «наоборот» (который мне нужен сам, ведя меня, чтобы найти этот вопрос, не помогло, и впоследствии another site which had the answer):
u'some string'.encode('ascii', 'xmlcharrefreplace')
вернет обычную строку с любыми символами без ascii, превращенными в объекты XML (HTML).
Я забыл про xmlcharrefreplace, и это было очень полезно. Каждый раз, когда мне нужно безопасно хранить закодированные или не ascii символы в mysql, я считаю, что мне нужно использовать этот метод. – cybertoast
Это не работает с строковым литералом, содержащим символ юникода U + 2019, эквивалент HTML-эквивалента. ’ . Разве это не то, о чем просил вопрос (этот ответ преобразует ascii, который является подмножеством юникода)? text.decode ('utf-8'). Encode ('ascii', 'xmlcharrefreplace') –
@MikeS Он работает без проблем; '>>> u '\ u2019'.encode (' utf-8 '). decode (' utf-8 '). encode (' ascii ',' xmlcharrefreplace ')' дает '' ’ '' –
Как hekevintran предлагает ответ, вы можете использовать cgi.escape(s)
для кодирования жала, но обратите внимание, что кодирование цитаты ложно по умолчанию в этой функции, и это может быть хорошая идея, чтобы передать аргумент quote=True
ключевого слова вместе с вашей строкой. Но даже при пропускании quote=True
, функция не избежит одиночных кавычек ("'"
) (Из-за эти вопросы функции была deprecated начиная с версии 3.2)
Было предложено использовать html.escape(s)
вместо cgi.escape(s)
. (Новое в версии 3.2)
также html.unescape(s)
был introduced in version 3.4.
Так питон 3.4 вы можете:
html.escape(text).encode('ascii', 'xmlcharrefreplace').decode()
для преобразования специальных символов в HTML сущности.html.unescape(text)
для преобразования объектов HTML обратно в текстовые представления.В Python 2.7 вы может использовать HTMLParser.unescape (текст) – frank
Обновление для Python 2.7 и BeautifulSoup4
экранирования в - Unicode HTML в юникод с htmlparser
(Python 2.7 стандартных 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
экранирования в - 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 - Юникода в Юникод 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'
upvote для показа стандартного решения библиотеки без зависимостей –
Пересмотр Я только что видел комментарий @bobince, оставленный на вопросе, указывающем на [этот ответ] (http://stackoverflow.com/a/663128/1599229). Поскольку 'htmlparser' документирован сейчас, и поскольку этот комментарий не является заметным, оставляя эту часть ответа. – bahmait
Я использовал следующую функцию для преобразования 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'))
надеюсь, что это полезно для кого-то
Если кто-то вроде меня там интересно, почему некоторые числа сущностей (коды), как ™ (for trademark symbol), € (for euro symbol)
не кодируются правильно, причина в ISO-8859-1 (ака Windows-1252) эти символы не определены.
отметить также, что набор символов по умолчанию, как в html5 является UTF-8 это ISO-8859-1 для HTML4
Таким образом, нам придется обойти каким-то образом (найти & заменить те, на первом)
Reference (начальная точка) из документации в Mozilla
https://developer.mozilla.org/en-US/docs/Web/Guide/Localizations_and_character_encodings
@Jarret Hardie: на самом деле, показать и рассказать совершенно отлично на SO. Из первой записи в FAQ (http://stackoverflow.com/faq) «Также прекрасно спросить и ответить на свой собственный вопрос программирования». Хотя, также рекомендуется искать дубликаты. – chauncey
Я отправляю вопросы, которые я сам ответил в прошлом, в интересах других пользователей, которые ищут похожие ответы. – hekevintran
+1 Он вносит свой вклад в набор данных. –