我认为这可用于搜索“错误”
的标记值import xml.etree.cElementTree as ET
xml = """
<tag1>
<tag2>
error
</tag2>
<tag3>
working
</tag3>
<tag4>
<tag5>
error
</tag5>
</tag4>
</tag1>
"""
for event, element in ET.fromstring(xml):
if element.text.strip() == "error":
print element.tag
我遇到了以下错误:
Traceback (most recent call last):
File "test.py", line 19, in <module>
for event, element in ET.fromstring(xml):
ValueError: need more than 0 values to unpack
“解包需要多于0个值”是什么意思?
答案 0 :(得分:3)
对一个Element
对象进行迭代,一次只能产生一个元素,但是你的循环期望两个值。您在这里.fromstring()
与.iterparse()
混淆。
你真的需要.findall()
:
tree = ET.fromstring(xml)
for elem in tree.findall('.//*'):
if elem.text and elem.text.strip() == 'error':
print elem.tag
或.iter()
,它执行相同的操作(循环遍历树中的所有元素):
tree = ET.fromstring(xml)
for elem in tree.iter():
if elem.text and elem.text.strip() == 'error':
print elem.tag
如果您真的想使用事件驱动程序iterparse
,则需要提供文件对象:
from cStringIO import StringIO
for event, element in ET.iterparse(StringIO(xml)):
if element.text.strip() == "error":
print element.tag
所有代码段打印:
tag2
tag5
答案 1 :(得分:1)
文档迭代器返回Element,无法将其拆分为(event,element)。你应该删除'event'。但这不是很正确,因为元素迭代器只会给你孩子(tag2,tag3,tag4)。你需要调用element.iter()来获取所有后代。
>>> for element in ET.fromstring(xml).iter():
... if element.text.strip() == 'error':
... print element.tag
...
tag2
tag5
>>>