解析utf8 xml时出现lxml编码错误

时间:2012-12-07 15:01:13

标签: xml encoding utf-8 lxml

我正在尝试使用lxml迭代XML文件(UTF-8编码,以其开头),但在角色上获得以下错误丂:

UnicodeEncodeError:'cp932'编解码器无法对位置0中的字符u'\ u4e02'进行编码:非法多字节序列

此前的其他字符正确打印出来。 代码是:

parser = etree.XMLParser(encoding='utf-8')
tree = etree.parse("filename.xml", parser)
root = tree.getroot()
for elem in root:
    print elem[0].text

错误是否意味着它没有在utf-8中解析文件,而是在移位JIS中解析?

2 个答案:

答案 0 :(得分:2)

UnicodeEncodeError的堆栈跟踪指向发生异常的位置。 不幸的是你没有包含它,但它很可能是将unicode文本打印到stdout的最后一行。我假设stdout在您的系统上使用cp932编码。

如果我的假设是正确的,您应该考虑更改您的环境,以便stdout使用可以表示unicode字符的编码(如UTF-8)。 (参见例如Writing unicode strings via sys.stdout in Python)。

答案 1 :(得分:2)

我使用lxml的objectify有类似的情况。以下是我能够解决的问题。

import unicodedata
my_name = root.name.text
if isinstance(my_name, unicode):
    # Decode to string.
    my_name = unicodedata.normalize('NFKD', my_name).encode('ascii','ignore')