Python UnicodeEncodeError:如何对使用ElementTree解析的xml树进行编码

Python UnicodeEncodeError:如何对使用ElementTree解析的xml树进行编码,python,xml,encoding,utf-8,nltk,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> ... &

我有一个具有以下结构的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>
然后,我尝试打印“两个”元素的内容,如下所示:

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)
回溯(最近一次呼叫最后一次):
文件“”,第3行,在
UnicodeEncodeError:“ascii”编解码器无法对位置21中的字符u'\xe0'进行编码:序号不在范围内(128)
我知道这是由于ascii和UTF-8编码的不兼容问题造成的。XML编码是UTF-8。我在stackoverflow上尝试了几种解决方案(主要是:我尝试在这里和那里添加
.encode('UTF-8')
.decode('UTF-8')
),或者在
数据中添加
编码('UTF-8'
),但我发现的示例与我的非常不同,因此,我没有设法将这些答案应用到我的案例中:正如您所想象的,我对python是新手


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

所以
two。文本应该是Unicode字符串,你想
打印它,为什么不检查一下呢

if u'keyword' in two.text:
如果合适的话

print(two.text)
没有艰苦的严格化?如果您的终端设置正确,它将告诉Python使用哪种编码向其发送正确表示该字符串的字节,以便于显示

通常最好是统一使用Unicode(这就是为什么
str
在Python3:-)中变成Unicode,并且只在输入时解码,在输出时编码——通常I/O系统会非常透明地为您处理解码和编码

取决于您的Python版本(您没有告诉我们),您可能需要执行一些显式编码——尽快,而不是一天中的晚些时候。例如,如果您一直使用Python 2,而
wow
是一个Unicode字符串(我想这取决于您的
nltk
版本),那么

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


为了消除这些疑问,
print(repr(wow[:30]))
或其他相关内容将告诉您更多信息。而
print(sys.version)
将告诉您Python的哪个版本,这样您就可以反过来告诉我们,因为很少有人会这样做,尽管它通常是绝对重要的信息!)

尝试使用unicode(two.text)中的u'keyword'
——当您对对象调用
str
时,您将该对象强制为字符串格式,该格式使用ascii编解码器。如果您的对象包含非ascii元素,则会引发错误。无需调用
unicode
或--
two。文本应该已经是unicode(如果不是,解码无论如何都需要显式编解码器,并且应该更早进行)。感谢duhaime和Alex,
str
正是导致问题的原因!我不知道
str
强制使用ascii格式的文本。但错误似乎指向第3行,所以这不意味着
str()
调用导致了问题吗?@duhaime当然,
str(…)
发生在
打印
中等价的
%
格式之前——两者都尝试将
two.text
编码为ascii。两者都不是必需的!请看我的回答:没有
str
调用,也没有
%
print
中。对不起,我忘了告诉你,我的python版本是2.7,剪切
str
效果很好!问题是我在使用和修改nltk书中的代码,我认为
str
是至关重要的,但事实并非如此。谢谢
tree = ElementTree().parse(wow.encode('utf8'))