UnicodeEncodeError: how to encode xml tree parsed with ElementTree

UnicodeEncodeError: how to encode xml tree parsed with ElementTree

我有一个具有这种结构的 XML 文件:

<doc>
 <content>
  <one>Title</one>
  <two>bla bla bla bla</two>
 </content>
 <content>
  <one>Title</one>
  <two>bla bla bla bla</two>
 </content>
 ...
</doc>

我通过nltk包读取了python中的文件,然后用ElementTree解析树如下:

from xml.etree.ElementTree import ElementTree
wow = nltk.data.find('/path/file.xml')
tree = ElementTree().parse(wow)

然后我尝试从 'two' 个元素打印一些东西,如下所示:

for i, content in enumerate(tree.findall('content')):
    for two in content.findall('two'):
        if 'keyword' in str(two.text):
            print("%s" % (two.text))

我得到了臭名昭著的错误:

Traceback (most recent call last):
   File "<stdin>", line 3, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 21: ordinal not in range(128)

我知道这是由于 ascii 和 UTF-8 编码的不兼容问题。 XML编码是UTF-8。我尝试了在 Whosebug 上找到的几种解决方案(主要是:我尝试在这里和那里添加 .encode('UTF-8').decode('UTF-8'),或者在 data.find 中添加 encoding='utf-8'),但是我找到的示例与我的完全不同,所以我没有设法根据我的情况调整这些答案:正如你想象的那样,我是 python.

的新手

如何避免错误并打印出我需要的内容?谢谢。

所以 two.text 应该是一个 Unicode 字符串,而您想 print 它——为什么不直接检查

if u'keyword' in two.text:

然后如果合适

print(two.text)

没有费力的字符串化?如果您的终端设置正确,它会告诉 Python 使用哪种编码来向它发送正确表示该字符串的字节以供显示。

通常最好在 Unicode 中统一工作(这就是为什么 str 在 Python 3:- 中变成了 unicode 的原因)并且只在输入上解码,在输出上编码——通常 I/O 系统将非常透明地为您处理解码和编码。

根据您的 Python 版本(您没有告诉我们),您 可能 需要做一些明确的编码——尽快,一天不晚。例如,如果您坚持使用 Python 2,并且 wow 是一个 Unicode 字符串(我认为取决于您的 nltk 版本),那么

tree = ElementTree().parse(wow.encode('utf8'))

可能效果更好;如果 wow 已经是一个 utf8 编码的字节字符串,因为它来自 nltk,那么显然你不需要再次编码它:-).

为了消除这样的疑虑,print(repr(wow[:30]))左右会告诉你更多。 print(sys.version) 会告诉您 Python 的版本,因此您可以反过来告诉我们,因为似乎很少有人这样做,尽管它通常是绝对重要的信息!-)