如何选择下一个一级元素



如何选择下一个又一个元素(所有元素都放置在一个级别中(。

例如,我有以下代码:

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

您似乎需要一个 XPath 轴操作。 目前还不完全清楚您想要的输出是什么,但我会解释您需要的工具。

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(。

最新更新