我有一个具有以下结构的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的新手。
如何避免错误并打印出我需要的内容?感谢。
答案 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,所以你可以反过来告诉我们,因为很少有人似乎做,尽管它通常是绝对至关重要的信息! - )