在Python中转义HTML实体和UTF-8

在Python中转义HTML实体和UTF-8,python,character-encoding,Python,Character Encoding,我正在解析一个包含许多特殊字符(Unicode和HTML实体形式)的HTML文件。 尽管阅读了大量关于Unicode和Python的文档,但我仍然无法正确转换HTML实体 以下是我运行的测试: >>> import HTMLParser >>> p = HTMLParser.HTMLParser() >>> s = p.unescape("‹") >>> repr(s) "u'\\x8b'" >>

我正在解析一个包含许多特殊字符(Unicode和HTML实体形式)的HTML文件。 尽管阅读了大量关于Unicode和Python的文档,但我仍然无法正确转换HTML实体

以下是我运行的测试:

>>> import HTMLParser
>>> p = HTMLParser.HTMLParser()
>>> s = p.unescape("‹")
>>> repr(s)
"u'\\x8b'"
>>> print s 
‹ # !!!
>>> s
u'\x8b'
>>> print s.encode("latin1")
‹ # OK, it prints fine in latin1, but I need UTF-8 ...
>>> print s.encode("utf8")
‹ # !!!

>>> import codecs
>>> out = codecs.open("out8.txt", encoding="utf8", mode="w")
>>> out.write(s)
# Viewing the file as ANSI gives me ‹ # !!!
# Viewing the file as UTF8 gives NOTHING, as if the file were empty # !!!

将未转义字符串s写入UTF8文件的正确方法是什么?

U+008B是一个控制字符,因此没有任何异常。“媫”是U+2039单左指角引号,在拉丁语-1中不是偶数。但是,它是CP1252中的字符0x8B。并停止依赖Windows控制台输出来告诉您什么是正确的或不正确的,除非您事先运行
chcp 65001

您是否碰巧在Windows中看到命令提示符?如果您的交互式会话本身在UTF-8终端上运行,您将只能看到UTF-8编码打印的正确输出。事实并非如此,因为如果它位于何处,则编码为
latin1
的打印将失败。要回答有关会话编码的问题,请通过
locale
命令的输出确认它是UTF-8。(我在Linux下)我通过SSH使用Linux控制台。根据您的解释,我可以推断
unescape()
函数中有一个bug,它返回U+008B而不是U+2039。我错了吗?错误在数据中。或者更具体地说,是生成数据的任何东西。它应该使用
对字符进行编码,但自私自利地假设世界围绕着Microsoft,并使用了一个字符。很好的链接,我还没有找到HTML实体的完整列表。你说得对,数据违反了规范。使用‹运行我的测试;给出了预期的结果。