欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XPath的使用

程序员文章站 2022-05-19 14:21:01
...

常用的路径表达式

表达式 描述
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字符串