【发布时间】:2015-03-31 00:18:59
【问题描述】:
我有一个具有这种结构的 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)
然后我尝试从“两个”元素中打印一些东西,如下所示:
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'),或者在data.find中添加encoding='utf-8'),但我发现的示例与我的完全不同,所以我没有设法使这些答案适应我的情况:正如您想象的那样,我是 python 新手。
如何避免错误并打印我需要的内容?谢谢。
【问题讨论】:
-
try
if u'keyword' in unicode(two.text):-- 当你在一个对象上调用str时,你会将该对象强制转换为使用 ascii 编解码器的字符串格式。如果您的对象包含非 ascii 元素,则会引发错误。 -
也不需要调用
unicode--two.text应该已经是 unicode(如果不是,则解码无论如何都需要显式编解码器,并且应该更早发生)。 -
感谢 duhaime 和 Alex,
str正是导致问题的原因!我不知道str将文本强制转换为ascii。
标签: python xml encoding utf-8 nltk