如何选择接下来的元素(所有元素都放在一个级别中)。
例如我有这段代码:
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
答案 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导向)。