UnicodeEncodeError:如何编码使用ElementTree解析的xml树

时间:2015-01-31 17:13:10

标签: python xml encoding utf-8 nltk

我有一个具有以下结构的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)

然后我尝试从两个&#39;打印一些东西。像这样的元素:

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。我尝试了在stackoverflow上找到的几个解决方案(主要是:我尝试在这里和那里添加.encode('UTF-8').decode('UTF-8'),或者在encoding='utf-8'中添加data.find,但我发现的示例与我的完全不同,所以我没有设法让这些答案适应我的情况:你可以想象,我是python的新手。

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

1 个答案:

答案 0 :(得分:2)

所以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,所以你可以反过来告诉我们,因为很少有人似乎做,尽管它通常是绝对至关重要的信息! - )