我正在尝试使用ElementTree python 2.7.6解析一个从某个服务器以unicode编码的xml文件,并在本地保存包含的数据。
import xml.etree.ElementTree as ET
def normalize(string):
if isinstance(string, unicode):
normalized_string = unicodedata.normalize('NFKD', string).encode('ascii','ignore')
elif isinstance(string, str):
normalized_string = string
else:
print "no string"
normalized_string = string
normalized_string = ''.join(e for e in normalized_string if e.isalnum())
return normalized_string
tree = ET.parse('test.xml')
root = tree.getroot()
for element in root:
value = element.find('value').text
filename = normalize(element.find('name').text.encode('utf-8')) + '.txt'
target = open(filename, 'a')
target.write(value + '\n')
target.close()
我正在解析的文件结构类似于以下内容,我在本地保存为test.xml
:
<data>
<product><name>Something with a space</name><value>10</value> </product>
<product><name>Jakub Šlemr</name><value>12</value></product>
<product><name>Something with: a colon</name><value>11</value></product>
</data>
上面的代码有很多问题,我想解决这个问题:
Š
。编辑:已解决此问题,部分原因是文件编码错误。normalize
函数。这是一个好的方法吗?element.find('value').text
是访问xml文档中存储的值的最佳方式,假设每个element
都有一个名为value
的条目吗?答案 0 :(得分:1)
element.find('value').text
中的值是unicode对象。当您将它们与ascii字符串对象(如'.txt'
)一起附加时,它们会与所需的转换连接在一起。
在序列化对象之前,无法打印或存储unicode对象。如果您没有明确地这样做,Python将使用默认编码设置隐式地执行此操作。默认编码为ASCII,它仅支持非常有限的字符集,导致UnicodeEncodeError
包含任何包含非ascii字符的输入数据。
我建议您使用适合您的解决方案的编解码器,使用encode()
方法将您的unicode对象显式编码为字符串。例如,如果要将文本元素编码为UTF-8
编码的字符串,请调用:
element.find('value').text.encode('utf-8')
另外,请检查XML中的encoding属性是否已正确设置。错误的编码是解析错误的一个非常可能的原因。