【问题标题】:Weird behaviour with lxml getiterator()lxml getiterator() 的奇怪行为
【发布时间】:2010-08-12 18:46:06
【问题描述】:

我有以下 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

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

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

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

【问题讨论】:

  • 我也试过这样做:if text.text == '\n': continue 这样它会跳过空行,但它不会。

标签: python lxml


【解决方案1】:

默认情况下,lxml.etree 会将标签之间的空文本视为该标签的文本内容,在您的情况下,显示的空格来自 &lt;x&gt;。如果您想要一个忽略空格的解析器,您需要执行以下操作:

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

【讨论】:

  • 小备注:None 是独一无二的,所以你可以(并且,在我看来,应该)直接使用if node.text is None。我的两分钱!
【解决方案2】:

虽然我不确定,但我认为它正在尝试读取 中的文本。

不管怎样,有什么问题

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

【讨论】:

  • 啊。我忘了我也可以使用strip()
  • 它解决了我的问题,但它为什么会发生的问题仍然存在。
  • 因为元素 包含文本,在这种情况下它只是空格,但它仍然是文本。
猜你喜欢
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2015-07-20
相关资源
最近更新 更多