xpath的//什么时候返回所有范围符合的标签

xpath的//什么时候返回所有范围符合的标签

html获取到第一个b标签, 

为什么html1的//d返回的是两个b下的d
html2的./c//d却是第一个b下的d

from lxml import etree

s = """
<a>
<b>
<c>
<d>d1</d>
</c>
</b>
<b>
<c>
<d>d2</d>
</c>
</b>
</a>
"""
html = etree.HTML(s)
html = html.xpath('/html/body/a/b[1]')[0] # 获取第一个b标签
html1 = html.xpath('//d')
html2 = html.xpath('./c//d')
for i in html1:
print('html1', etree.tostring(i).decode())
for i in html2:
print('html2', etree.tostring(i).decode())


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕美 2021-08-15 10:14:45

同学,你好!//d返回的是文档中所有的d标签,不仅仅是第一个b标签中的;而./c//d选择的是当前节点中c标签的后代的所有d标签

祝学习愉快!

  • 提问者 大可计划 #1

    我第一个xpath, 不是选择了第一个b吗, 为什么//d, 还能查到另外一个d

    html = html.xpath('/html/body/a/b[1]')[0]
    2021-08-15 16:34:20
  • 好帮手慕美 回复 提问者 大可计划 #2

    同学,你好!//d:以//开头就表示从根节点开始,并不会受html.xpath()的影响。若要获取第一个b标签中的d,需要使用.//d

    http://img1.sycdn.imooc.com//climg/6118e05e09dcaaff08470305.jpg

    祝学习愉快!

    2021-08-15 17:40:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师