使用lxml查找文本和子元素的顺序

时间:2010-07-14 13:55:50

标签: python html xml lxml

假设我有以下HTML:

<div>
text1
<div>
  t1
</div>
text2
<div>
  t2
</div>
text3
</div>

我知道如何使用lxml.html获取封闭div的文本和子元素。但有没有办法以迭代的方式访问文本和子元素,保留顺序?换句话说,我想知道div的“自由文本”相对于图像的位置。我希望能够知道“text1”出现在第一个内部div之前,而text2出现在两个内部div之间,等等。

1 个答案:

答案 0 :(得分:2)

elementtree提供的lxml界面支持 - 例如使用Python 2.7中的内置元素树:

>>> from xml.etree import ElementTree as et
>>> x='''<div>
... text1
... <div>
...   t1
... </div>
... text2
... <div>
...   t2
... </div>
... text3
... </div>'''
>>> t=et.fromstring(x)
>>> for el in t.iter():
...   print '%s: %r, %r' % (el.tag, el.text, el.tail)
... 
div: '\ntext1\n', None
div: '\n  t1\n', '\ntext2\n'
div: '\n  t2\n', '\ntext3\n'

根据您的lxml / elementtree版本,您可能需要拼写迭代器方法.getiterator()而不是.iter()

如果您需要一个能够按顺序生成标签和文本的单个生成器,例如:

def elements_and_texts(t):
    for el in t.iter():
        yield 'tag', el.tag
        if el.text is not None:
            yield 'text', el.text
        if el.tail is not None:
            yield 'tail', el.tail

这基本上删除了None并产生了两个元组,第一项为'tag''text''tail',以帮助您区分。我想这不是你理想的格式,但要把它塑造成你喜欢的东西并不困难; - )。