我正在尝试解析一个XML,看起来像这样。我想提取有关katagorie的信息,即ID,父ID等:
<?xml version="1.0" encoding="UTF-8"?>
<test timestamp="20210113">
<kategorien>
<kategorie id="1" parent_id="0">
Sprache
</kategorie>
</kategorien>
</test>
我正在尝试
fields = ['id', 'parent_id']
with open('output.csv', 'wb') as fp:
writer = csv.writer(fp)
writer.writerow(fields)
tree = ET.parse('./file.xml')
# from your example Locations is the root and Location is the first level
for elem in tree.getroot():
writer.writerow([(elem.get(name) or '').encode('utf-8')
for name in fields])
但我得到了这个错误:
in <module>
writer.writerow(fields)
TypeError: a bytes-like object is required, not 'str'
即使我已经在代码中使用了encode('utf-8')
,我怎样才能消除这个错误呢?
2条答案
按热度按时间ffdz8vbo1#
1.可以使用嵌套循环:
输出:
["1"、"0"]
在这里,它也可以返回具有
id
和parent_id
但没有名称kategorie
的类。1.如果您希望以更高的性能和更少的内存执行任务:
输出:
["1"、"0"]
对于此方法,它将为每个名为
kategorie
的类和子类返回。对于上面的
xml
文件,代码似乎可以完美地工作:输出:
["1"、"0"]
fields
是一个包含str
而不是byte
的列表,这就是为什么它给你错误。我本来建议你把写类型从wb
改为w
,但是看看剩下的代码,看起来你想用byte
写。encode()
只是将您的数据转换为byte
。t3irkdon2#
我发现了两个问题。首先,你不需要自己编码。打开没有“b”二进制标志的文件并跳过. encode。file对象将为你编码。你看到的错误来自
['id', 'parent_id']
列表,该列表包含未编码的字符串。但是如果你一开始没有用二进制打开,这不是问题。第二,你迭代了错误的元素,在循环中添加一个
print(elem)
,你会看到,相反,你可以使用带有伪xpath的findall
来得到你想要的元素。