【发布时间】:2020-12-07 23:34:12
【问题描述】:
我有 xml 文档(用 UTF-8 编码),其结构为:
<Group id= "123">
<rule id= "abc" level= "low">
<identity>some text</identity>
<element1>text</element1>
</Group>
每个文档都有多个 Group 元素,目标是将它们解析为一个电子表格,其中每个组是一行,其中包含 group id、level 以及来自 identity 和 element1 元素的文本。
我有一个使用 findall() 的脚本,当我尝试一次解析一个文档时它可以工作,但是当我尝试一次解析多个文档时,它往往会失败并显示错误:
File "c:/Documents/Python Projects/Bulkparse.py", line 86, in parseall
writer.writerow(data)
File "C:\Program Files (x86)\Python\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x9d' in position 1137: character maps to <undefined>
我查了 '\x9d' 字符代码,它似乎是某种十字图标,它没有出现在我的任何文档中。所以我确定它发生在哪里或为什么会发生。
Findall() 脚本示例:
for child in root.findall('Group'):
data.append(child.attrib['id'])
num = child.attrib['id']
for child in root.findall('Group[@id = "%s"]/Rule'% num ):
data.append(child.attrib['level'])
# followed by a for loop for each element needed ending with
writer.writerow(data)
上述方法有效,除非我正在做大量工作,这给了我上述错误。
只是 findall() 效率太低了吗?我尝试用 iterparse() 编写一些东西,但找不到一种方法让它遍历每个子元素。例如:
for event, elem in context:
if elem.tag ==f"Group" and event == 'end':
data.append(elem.attrib['id'])
num = elem.attrib['id']
for event, elem in context :
if elem.tag ==f"Rule" and event == 'end':
data.append(elem.attrib['level'])
print(data)
返回组 id,后跟每个组的等级等级,如 [123、low、high、low、low、low、high..] 等。
使用 iterparse 更好吗?如果是这样,有没有办法让我将它的目标元素标签嵌套在组元素中,就像我对 findall() 所做的那样? 或者有没有办法让 findall() 脚本停止抛出该错误?有没有办法清除每个文档末尾的内存? (假设这会有所帮助) 非常感谢您的帮助。
【问题讨论】:
-
请提供完整的堆栈跟踪。解码/编码错误通常与读取/写入文件(或类似流)有关,代码中没有显示任何内容。
-
该错误表明某些编码不匹配。在 UTF-8 中,
9d是一个连续字节(不应单独出现)。在 cp1252 编码中,9d是未定义的。 -
既然错误是由
writer.writerow(data)抛出的——writer是什么?
标签: python python-3.x xml-parsing lxml