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 的版本,因此您可以反过来告诉我们,因为似乎很少有人这样做,尽管它通常是绝对重要的信息!-)
我有一个具有这种结构的 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 的版本,因此您可以反过来告诉我们,因为似乎很少有人这样做,尽管它通常是绝对重要的信息!-)