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

0 投票
1 回答
512 浏览
提问于 2025-04-18 17:30

我该如何选择一个元素后面的下一个元素(所有元素都在同一层级)。

比如我有以下这段代码:

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

你似乎需要使用一种叫做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"的兄弟节点。很明显,前面三个root节点都有相同的三个孩子,而最后一个节点则没有孩子。

如果你只想查看紧挨着的下一个兄弟节点,并检查它是否是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)。

撰写回答