XPath的使用

本文详细介绍了XPath的常用路径表达式,如child、attribute、ancestor等,并讲解了通配符、谓语、运算符的使用。还探讨了如何获取属性值以及使用XPath中的函数,如count、concat、string、local-name等。通过示例展示了如何定位和操作XML或HTML文档中的节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用的路径表达式

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
.选取当前节点
选取当前节点的父节点
@属性名选取属性
|选取若干路径

当前节点的相关节点

  1. child:选取当前节点的所有子元素

    child子节点定位://div[@id="testid"]/child::ul/li/text()

    当前节点的所有子元素//div[@id="testid"]/child::*

    定位某节点下为ol的子节点下的所有节点//div[@id="testid"]/child::ol/child::*/text()

  2. attribute选取当前节点的所有属性

    attribute定位id属性值//div/attribute::id

    定位当前节点的所有属性://div[@id="testid"]/attribute::*')

  3. ancestor:父辈元素

    ancestor-or-self:父辈元素及当前元素

    //div[@id="testid"]/ancestor::div/@price')定位父辈div元素的price属性

    //div[@id="testid"]/ancestor::div所有父辈div元素

    //div[@id="testid"]/ancestor-or-self::div所有父辈元素以及当前节点div元素

  4. descendant:后代

    descendant:后代及当前节点本身

    使用和ancestor一样

  5. following:选取文档中当前节点的结束标签之后的所有节点

    //div[@id="testid"]/following::div[not(@id)]/.//li[1]/text()定位testid之后不包含id属性的div标签下所有的li中的第一个li的text属性

  6. namespace:选取当前节点的所有命名空间节点

    //div[@id="testid"]/namespace::*选取命名空间节点

  7. parent:选取当前节点的父节点

    //li[@data="one"]/parent::ol/li[last()]/text()选取data值为one的父节点的子节点中最后一个节点的值

  8. preceding-sibling:选取当前节点之前的所有同级节点

    //div[@id="testid"]/preceding-sibling::div/ul/li[2]/text()

  9. self:选取当前节点

    //div[@id]/self::div[@data-h]/attribute::*

  10. position定位

    //*[@id="testid"]/ol/li[position()=2]/text()

  11. 条件

    u'//h2[text()="这里是个小标题"]/text()'

  12. 当前节点的下几个节点

    <div>
        <a id="1" href="www.baidu.com">我是第1个a标签</a>
        <p>我是p标签</p>
        <a id="2" href="www.baidu.com">我是第2个a标签</a>
        <a id="3" href="www.baidu.com">我是第3个a标签</a>
        <a id="4" href="www.baidu.com">我是第4个a标签</a>
        <p>我是p标签</p>
        <a id="5" href="www.baidu.com">我是第5个a标签</a>
    </div>
    

    获取第三个a标签的下一个a标签:"//a[@id=‘3’]/following-sibling::a[1]"

    获取第三个a标签后面的第N个标签:"//a[@id=‘3’]/following-sibling:?[N]"

    获取第三个a标签的上一个a标签:"//a[@id=‘3’]/preceding-sibling::a[1]"

    获取第三个a标签的前面的第N个标签:"//a[@id=‘3’]/preceding-sibling:?[N]"

通配符

选取未知的xml元素

通配符描述举例结果
*匹配任何元素节点xpath(‘div/*’)获取div下的所有子节点
@*匹配任何属性节点xpath(‘div[@*]’)获取所有带属性的div节点
node()匹配任何类型的节点

#多个

xpath('//div | //table') 
# 获取所有的div与table节点

谓语

表达式结果
xpath(’/body/div[1]’)选取body下的第一个div节点
xpath(’/body/div[last()]’)选取body下的最后一个div节点
xpath(’/body/div[last()-1]’)选取倒数第二个
xpath(’/body/div[posion()❤️]’)前两个
xpath(’/body/div[@class]’)带有class属性的div节点
xpath(’/body/div[@class=“main”]’)选取class属性值为main的div节点
xpath(’/body/div[price]>35.00’)选取body下price元素大于35的节点

运算符

+ - * div = != < <= > >= or and mod

获取属性值

//div[@id="indexCarousel"]//div[@class="item"]//img/@src

//div[@class="book-mid-info"]/h4/a/@href

函数

count:统计

'count(//li[@data])'

concat:字符串连接

concat(//li[@data="one"]/text(),//li[@data="three"]/text())

string:解析当前节点下的字符

string(//li)

local-name:解析节点名称

'local-name(//*[@id="testid"])'

contains(string1,string2):如果 string1 包含 string2,则返回 true,否则返回 false

//h3[contains(text(),"H3")]/a/text()

not:布尔值(否)

count(//li[not(@data)]):不包含data属性的li标签统计

string-length:返回指定字符串的长度

//*[string-length(local-name())<2]/text()string-length函数+local-name函数定位节点名长度小于2的元素

starts-with:以。。

//li[starts-with(@code,"8")]/text()定位属性值以8开头的li元素

div:对某两个节点的属性值做除法

//div[@id="testid"]/ul/li[3]/@code div //div[@id="testid"]/ul/li[1]/@code

还原element对象

etree.tostring(s) 还原这个对象为html字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值