首页 > 其他分享 >Xpath 高级用法

Xpath 高级用法

时间:2022-09-26 17:34:54浏览次数:52  
标签:Xpath xpath 标签 tr 高级 用法 id div 节点

xpath 高级用法

1. 匹配当前节点下的所有:

.//
.   表示当前
//  表示当前标签下的所有标签
注: 要配合使用

2. 匹配某标签的属性值: /@属性名称

这里以input里的value值为例:

例:xpath(//input/@value)

3. 匹配多个路径

在一个xpath中写的多个表达式用 | 分开, 每个表达式互不干扰。
xpath("//tr[6]/td[2]/text() | //tr[7]/td[2]/text()")

4. 按属性匹配:@获取所有id="test"的所有文本内容

xpath('//*[@id="test"]//text()')

5. 匹配不包含某个属性的标签 not

多用于表格中匹配中不包含表头信息的数据
xpath('//table/tr[not(@class="tbhead")]')

6. 匹配包含多个属性的标签: and匹配所有的tr中不包含 tbhead 属性 和包含 head 的tr标签

xpath('//table/tr[not(@class="tbhead") and @class="head"]')

7. 匹配包含不同属性的名称相同的标签

or匹配包含class="speedbar" 或者 class="content-wrap" 的标签

xpath('//div[@class="speedbar" or @class="content-wrap"]')

8. 将对象还原为字符串:

etree.tostring()将匹配到的对象,作为etree.tostring()的参数即可,  注: 返回字符串

sObj = xml.xpath('//*[@id="test"]')[0] #使用xpath定位一个节点
sStr = etree.tostring(sObj)

9. 按轴(Axes)匹配

9.1 选取当前节点的所有子元素: child获取div下的tr的标签

xpath('//div[@id="testid"]/child::tr/td/text()') # 感觉这种方法鸡肋,
//div[@id="testid"]//tr/td 也可以实现

9.2 选取当前节点的所有属性:attribute

获取div标签所有的属性值

xpath('//div/attribute::*') # 感觉这种方法鸡肋,//div/@* 同样能实现

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

获取父辈元素的div的所有属性值, 在不好定位的情况下,通过孩子标签定位,这种方法可以用

xpath('//div[@id="test"]/ancestor::div/@*')
xpath('//div[@id="test"]/ancestor-or-self::div/@*')

9.4 descendant:后代 / descendant-or-self:后代及当前节点本身

获取孩子元素的div的所有属性值,感觉鸡肋

xpath('//div[@id="test"]/descendant::div/@*')
xpath('//div[@id="test"]/descendant-or-self::div/@*')

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

xpath('//div[@id="test"]/namespace::*')

9.6 定位:position

和通过下标定位一样, 方法鸡肋

xpath('//*[@id="test"]/ol/li[position()=2]/text()')

10.Xpath 函数:

10.1统计数量:count

统计符合要求节点的数量,  注: 返回字符串

xpath('count(//tr[@info])')

10.2 字符串拼接 :concat

统计出来的两个内容的字符串进行“ + ”处理, 注: 返回字符串

xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')

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

string()直解析匹配的第一个标签的值,  注: 返回字符串

xpath('string(//tr)')

10.4 获取当前节点的节点名称: local-name

返回当前属性的节点名称,  注: 返回字符串

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

10.5 以指定的字符开头:starts-with

starts-with定位属性值以8开头的li元素

xpath('//tr[starts-with(@code,"one")]/text()')

10.6 小于:<

匹配所有tr标签属性info小于200的内容

xpath('//tr[@info<200]/text()')

11. 根据指定的文本内容选择

# 指定的文本内容可以是文本内容的部分, 也可以是全部
//div[2]/ul/li[contains(text(), "指定的文本内容")]/span/text()

12 . 获取在此节点下的所有内容

//*[@class="init-content"]/..

13 position:定位

选择偶数项:[position()=(position() mod 2 = 0)]

选择奇数项:[position()=(position() mod 2 != 0)]

14 其他

后面+:: 然后输入标签 或者数字

child:选取当前节点的子元素
parent:选取当前节点的父节点
attribute:选取当前节点的属性
ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素
descendant:后代 / descendant-or-self:后代及当前节点本身
方法同上

following :选取当前节点的结束标签之后的所有节点,包括节点的子孙节点
preceding:选取当前节点的开始标签之前的所有节点,包括节点的子孙节点
following-sibling:选取当前节点之后的所有同级节点
preceding-sibling:选取当前节点之前的所有同级节点

标签:Xpath,xpath,标签,tr,高级,用法,id,div,节点
From: https://www.cnblogs.com/zichliang/p/16731710.html

相关文章

  • expect脚本远程登录、远程执行命令和脚本传参简单用法
    expect介绍:最近想写一个自动化安装脚本,涉及到远程登录、分发文件包、远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解......
  • provide 和 inject 用法及原理
    在父子组件传递数据时,通常使用的是props和emit,父传子时,使用的是props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,......
  • JS高级
    1.作用域1.1局部作用域局部作用域分为函数作用域和块作用域({})var是函数作用域const,let是块作用域1.2全局作用域<script>和js文件的最外层是全局作用域1.3作......
  • C# nameof的用法
     最重要的是nameof不会影响性能! nameof主要是解决类成员名做参数替代成员们的字符串做参数,如下:usingSystem;namespacecsharp6{internalclassProgram......
  • this关键字三种用法和super与this关键字图解
    this关键字三种用法super关键字用来访问父类内容,而this关键字用来访问本类内容。用法也有三种:1.在本类的成员方法中,访问本类的成员变量。2.在本类的成员方法中,访问本类的......
  • 9. NumPy高级索引
    1.前言NumPy与Python的内置序列相比,它提供了更多的索引方式。除了在《Numpy切片和索引》一节用到索引方式外,在NumPy中还可以使用高级索引方式,比如整数数组索引、布......
  • 继承中构造方法的访问特点和super关键字的三种用法
    继承中构造方法的访问特点1.子类构造方法当中有一个默认隐含的“super()"调用,所以一定是先调用的父类构造,后执行的子类构造。2.子类构造可以通过super关键字来调用父类重......
  • 《JavaScript高级程序设计》Chapter03学习笔记
    Chapter03JavaScriptLanguageSyntax类C区分大小写,标识符可以字母、下划线(_)、美元符号($)开头语句以分号(;)结尾:虽然不加分号也是被允许的,但会导致性能的降......
  • Vue 循环v-for列表用法
    v-for指令可以绑定数组的数据来渲染一个项目列表:<divid="app"><ol><liv-for="todointodos">{{todo.text}}</li></ol></div>varapp=newVue(......
  • Scanner进阶用法
    Scanner进阶用法判断是否为整数,浮点数packagecharpter2;​importjava.util.Scanner;​publicclassScanner3{  publicstaticvoidmain(String[]args){  ......