可能重复:
如何在Python中将HTML实体转换为Unicode,反之亦然?
可能重复:
如何在Python中将HTML实体转换为Unicode,反之亦然?
Answers:
至于“反之亦然”(我需要我自己,导致我发现这个问题没有帮助,随后又找到了一个有答案的站点):
u'some string'.encode('ascii', 'xmlcharrefreplace')
将返回一个纯字符串,其中任何非ASCII字符都将变成XML(HTML)实体。
>>> u'\u2019'.encode('utf-8').decode('utf-8').encode('ascii', 'xmlcharrefreplace')
给'’'
您需要有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-使用bs4
(BeautifulSoup4)进行Unicode编码的Unicode HTML :
>>> 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-使用bs4
(BeautifulSoup4)的Unicode编码HTML :
>>> 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'
htmlparser
现在开始有记录,并且由于该注释不突出,因此保留了答案的那一部分。
正如hekevintran答案所建议的那样,您可能会使用它cgi.escape(s)
来编码字符串,但是请注意,该函数中的quote编码默认情况下为false,因此最好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实体回纯文本表示。$ python3 -c "
> import html
> print(
> html.unescape('&©—')
> )"
&©—
$ python3 -c "
> import html
> print(
> html.escape('&©—')
> )"
&©—
$ python2 -c "
> from HTMLParser import HTMLParser
> print(
> HTMLParser().unescape('&©—')
> )"
&©—
$ python2 -c "
> import cgi
> print(
> cgi.escape('&©—')
> )"
&©—
HTML仅严格要求转义(与号)&
和<
(左尖括号/小于号)。https://html.spec.whatwg.org/multipage/parsing.html#data-state
如果像我这样的人在那里想知道为什么有些实体编号(代码)像 ™ (for trademark symbol), € (for euro symbol)
未正确编码,则原因是在ISO-8859-1(又名Windows-1252)中未定义这些字符。
另请注意,从html5开始,默认字符集为utf-8,对于html4则为ISO-8859-1
因此,我们将必须以某种方式解决该问题(首先查找并替换它们)
Mozilla文档的参考(起点)
https://developer.mozilla.org/zh-CN/docs/Web/Guide/Localizations_and_character_encodings
我使用以下函数将从xls文件中剥离的unicode转换为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'))
希望这对某人有用