如何选择下一个一级元素?
我该如何选择一个元素后面的下一个元素(所有元素都在同一层级)。
比如我有以下这段代码:
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)。