Python - 将unicode十六进制转换为字符串

0 投票
1 回答
570 浏览
提问于 2025-04-29 19:52

我正在使用 Readability Parser API 从网页中提取内容。当网页使用拉丁字符时,一切正常,但当我提取西里尔字母的文章时,结果却是这样的:

<div>&#x412;&#x432;&#x43E;&#x441;&#x43A;&#x440;&#x435;&#x441;&#x435;&#x43D;&#x44C;</div>...etc

有趣的是,网页的标题在西里尔字母中提取得很正确,但内容却不行。我尝试按照这个 SO答案 中的建议去做:

content = unicodedata.normalize('NFKD', content).encode('ascii','ignore')

但结果并没有成功。你能告诉我有没有办法在保存到数据库之前转换这个字符串吗?

如果我的问题标题能准确表达我的需求,请告诉我。谢谢。

暂无标签

1 个回答

2

一种方法(Python 3.3):

>>> s='<div>&#x412;&#x432;&#x43E;&#x441;&#x43A;&#x440;&#x435;&#x441;&#x435;&#x43D;&#x44C;</div>'
>>> import html.parser
>>> h=html.parser.HTMLParser()
>>> h.unescape(s)
'<div>Ввоскресень</div>'

Python 2.7:

>>> s='<div>&#x412;&#x432;&#x43E;&#x441;&#x43A;&#x440;&#x435;&#x441;&#x435;&#x43D;&#x44C;</div>'
>>> import HTMLParser
>>> h=HTMLParser.HTMLParser()
>>> print(h.unescape(s))
<div>Ввоскресень</div>

附注:我去找了一下文档链接,发现unescape这个函数没有文档说明。这里有一种不使用未记录的API的方法:

>>> re.sub(r'&#x(.*?);',lambda x: chr(int(x.group(1),16)),s)
'<div>Ввоскресень</div>'

根据评论来看,这个函数在Python 3.4中终于有了文档说明(并且位置也变了):

撰写回答