在python 2.7中读取包含unicode的XML文件

时间:2014-06-01 10:46:41

标签: xml python-2.7 unicode elementtree

我正在尝试使用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>

上面的代码有很多问题,我想解决这个问题:

  1. 此代码无法很好地消化unicode字符Š。编辑:已解决此问题,部分原因是文件编码错误。
  2. 我想避免文件名中的特殊字符,例如空格和冒号。预处理这些的最佳方法是什么?我根据Remove all special characters, punctuation and spaces from stringConvert a Unicode string to a string in Python (containing extra symbols)的答案构建了normalize函数。这是一个好的方法吗?
  3. element.find('value').text是访问xml文档中存储的值的最佳方式,假设每个element都有一个名为value的条目吗?

1 个答案:

答案 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属性是否已正确设置。错误的编码是解析错误的一个非常可能的原因。