2013-04-04 63 views
2

我認爲這將用於搜索的「錯誤」Python的搜索數據

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值解包「的意思?

回答

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

文檔迭代器返回元素,該元素不能拆分爲(event,element)。你應該刪除'事件'。但是這不是很正確,因爲元素迭代器只會給你孩子(tag2,tag3,tag4)。你需要調用element.iter()來獲得所有的後代。

>>> for element in ET.fromstring(xml).iter(): 
...  if element.text.strip() == 'error': 
...    print element.tag 
... 
tag2 
tag5 
>>>