2010-08-12 54 views
0

我有下面的XML文档:与LXML getIterator()方法怪异的行为

<x> 
    <a>Some text</c> 
    <b>Some text 2</b> 
    <c>Some text 3</c> 
</x> 

我想要得到的所有标签的文字,所以我决定用getiterator()

我的问题是,它增加了空白行,我无法理解的原因。考虑到这一点:

>>> for text in document_root.getiterator(): 
...  print text.text 
... 


Some text 
Some text 2 
Some text 3 

请注意在“某些文本”之前的两个额外的空白行。这是什么原因?如果我将标签传递给getiterator()方法,则没有空白行,因为它应该是。

>>> for text in document_root.getiterator('a'): 
...  print text.text 
... 
Some text 

所以我的问题是,是什么原因造成的情况下,那些多余的空行我通过getiterator()没有标签,如何清理?

+0

我也试过这样做:'if text.text =='\ n':continue',这样它就可以跳过空白行,但它不会。 – user225312 2010-08-12 18:51:11

回答

2

默认lxml.etree将视为文本内容为标签和你的情况空白标签之间的空白文本显示来自<x>。如果你想忽略你想要做的事,如空白分析器:

from lxml import etree 

parser = etree.XMLParser(remove_blank_text=True) 

tree = etree.XML("""\ 
    <x> 
     <a>Some text</a> 
     <b>Some text 2</b> 
     <c>Some text 3</c> 
    </x> 
""", parser) 

for node in tree.iter(): 
    if node.text == None: continue 
    print node.text 

注意如何node.text返回None如果没有任何文字。还请注意,the API documentation for lxml指出getiterator()已弃用,因此支持iter()

欲了解更多信息,请参阅The lxml.etree Tutorial: Parser objects

+0

啊,谢谢。这完美地回答了我的问题。 – user225312 2010-08-12 20:17:53

+0

很高兴成为服务;-) – 2010-08-12 22:47:01

+0

小评论:'None'是唯一的,所以你可以(并且在我看来应该)直接使用'if node.text is None'。我的两分钱! – 2011-10-28 12:29:42

0

虽然我不确定,但我会假设它试图读取< x>内的文本。

总之,这有什么错

for text in document_root.getiterator(): 
    if text.strip() == '': continue 
    print text 
+0

啊。我忘了我也可以使用'strip()'。 – user225312 2010-08-12 18:52:52

+0

它解决了我的问题,但它为什么发生的问题依然存在。 – user225312 2010-08-12 19:12:36

+0

由于元素包含文本,在这种情况下,它只是空白,但仍然是文本。 – 2010-08-12 19:27:28