2010-07-14 93 views
0

比方说,我有以下HTML的顺序:使用LXML查找文本和子元素

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

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

回答

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的版本,您可能需要拼iterator方法.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 S和产生两元组的'tag'第一项,'text',或'tail',帮助你区分。我想这不是你理想的格式,但不应该很难将它变成你喜欢的东西;-)。