如何选择下一个又一个元素(所有元素都放置在一个级别中(。
例如,我有以下代码:
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(。