如何选择下一个单级元素?

时间:2014-08-16 17:33:07

标签: python xpath lxml

如何选择接下来的元素(所有元素都放在一个级别中)。

例如我有这段代码:

from lxml import etree

html = """
    <div class="latest">
        <div class="root">  root1   </div>
        <div class="root">  root2   </div>
        <div class="root">  root3   </div>
        <div class="child"> child1  </div>
        <div class="child"> child2  </div>
        <div class="child"> child3  </div>
        <div class="root">  root4   </div>
    </div>
"""

tree = etree.HTML(html)

for i in tree.xpath('//div[@class="root"]'):
    # how i can do it? 
    next = i.etree('next div[@class="child"]')
    if next:
        # there i want doing something with `next`
        print 1
    else:
        print 0

1 个答案:

答案 0 :(得分:0)

您似乎需要XPath axis operation。它并不完全清楚你想要的输出是什么,但我会解释你到达那里所需的工具。

for div in doc.xpath('//div[@class="root"]'):
     children = div.xpath('following-sibling::div[@class="child"]')
     if children:
         print('yes')
     else:
         print('no')

yes
yes
yes
no

此轴操作说:在当前节点之后给出一个所有兄弟姐妹的列表,其名称为div且属性为class="child"。在这种情况下,显然前3个root节点具有3个子节点的相同列表,最后一个节点具有0的列表。

如果您只想查看下一个兄弟,并检查它是否为class="child",您也可以这样做:

for div in doc.xpath('//div[@class="root"]'):
     first_sib = div.xpath('following-sibling::*[1]')
     # `first_sib` is either a 0- or 1-length list, handle both gracefully
     if first_sib and first_sib[0].get('class') == 'child':
         print('yup')
     else:
         print('nope')

nope
nope
yup
nope

上面的MDN链接有更多的轴操作和一些非常好的教程(虽然它们可以在某些地方获得一些javascript导向)。