lxml getiterator()的奇怪行为

时间:2010-08-12 18:46:06

标签: python lxml

我有以下XML文档:

<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

注意'Some text'之前的两个额外空白行。这是什么原因?如果我将标记传递给getiterator()方法,则应该没有空白行。

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

所以我的问题是,如果我在没有标记的情况下通过getiterator()而导致这些额外的空白行是什么?如何删除它们?

2 个答案:

答案 0 :(得分: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将如何返回无。另请注意,the API documentation for lxml说明getiterator()已弃用iter()

有关详细信息,请参阅The lxml.etree Tutorial: Parser objects

答案 1 :(得分:0)

虽然我不确定,我会假设它正在尝试阅读&lt; x&gt;。

无论如何,

出了什么问题
for text in document_root.getiterator():
    if text.strip() == '': continue
    print text