2

我认为这将适用于搜索“错误”的标签值

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 个值才能解包”是什么意思?

4

2 回答 2

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
于 2013-04-04T17:25:47.720 回答
1

文档迭代器返回Element,不能拆分成(event, element)。您应该删除“事件”。但这也不完全正确,因为元素迭代器只会给你孩子(tag2,tag3,tag4)。您需要调用 element.iter() 来获取所有后代。

>>> for element in ET.fromstring(xml).iter():
...     if element.text.strip() == 'error':
...             print element.tag
...
tag2
tag5
>>>
于 2013-04-04T17:34:15.140 回答