代码之家  ›  专栏  ›  技术社区  ›  user225312

LXML GetIterator()的怪异行为

  •  0
  • user225312  · 技术社区  · 16 年前

    我有以下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”前面还有两行空白。为什么会这样?如果我把标签传给 GeTeRealTor() 方法中,没有空行,因为它应该是空行。

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

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   Bruce van der Kooij    16 年前

    默认情况下 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 .

        2
  •  0
  •   Robus    16 年前

    虽然我不确定,但我认为它试图在<x>中读取文本。

    总之,怎么了

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