1.基本概念
使用路径表达式在XML文档中进行定位或获取路径
1.1基本术语
(1)节点(node):类似于XML,整个HTML是被当做节点树对待的,分为7类节点:元素,属性,文本,命名空间,处理指令,注释,根节点(文档节点)
(2)节点关系
基本/原子节点:没有父节点或者子节点
根节点:即文档节点,是整个文档的节点顶端
父节点(parent):基准节点的上级节点
子节点(children):基准节点的下级节点
同胞节点(sibling):拥有相同父节点的节点
先辈(ancestor):基准节点的父节点以及以上节点
后代(descendant):基准节点的子节点或子的子节点
2.基本语法
以下示例均使用https://login.zhgcloud.com/select-group 页面元素作为演示
2.1节点选取
(1)直接使用节点名称:选取当前节点的所有子节点
(2)/:从根节点开始选取(绝对路径)
(3)//:从匹配到的节点选取(相对路径)
(4).:选取当前节点
(5)..:选取当前节点的父节点
div
/html/body/div[@id ="root"]
//div[@id ='root']
//div[@id ='root']/..
//div[@id ='root']/.
2.2谓语(predicates)
用于查找包含某个特定属性或者值的节点,谓语支持运算符,谓语信息放置到[]内
(1)属性值作谓语://div[@id ='root']
(2)Xpath函数作谓语:
定位到最后一个节点:
//li[last()]
定位到指定位置的节点:
//li[position()>1]
(3)双重谓语直接两个[]并列即可:属性和函数的并列谓语:
//li[@class="curp"][last()]
2.3Xpath通配符
(1):匹配任何元素节点
/:匹配根目录下的所有节点,不包含子节点
//:匹配根目录下的所有节点,包含子节点
(2)@:匹配任何属性节点,即匹配有属性的节点,不包含无属性的节点
//div[@*]
(3)node():匹配选择路径下的任何类型的节点
//div/node()
所有叫div的节点以及子节点
(4)问题:
//div/node()和//div/*
返回的数值不一样,请解释~~~
2.4选取若干路径
两个xpath表达式使用“|”分开,表示‘|’前后的两个表达式路径都获取,注意这里与谓语并列条件不同,这里是两个都取
//div[starts-with(@class,'provider')]|//span[contains(text(),'测试部')]
2.5Xpath的其他定位方式
(1)starts-with:匹配属性节点对应开始位置的关键字,对应的有ends-with
//*[starts-with(@class,'copyRight')]
(2)contain:匹配属性节点对应包含的关键字
//div[contains(@class,'login')]
(3)text()
//span[text()='免费咨询电话: ']
(4)not 返回所有非属性id=root的div
//div[not (@id='root')]
(5)交叉使用
匹配包含文本的节点://span[contains(text(),'免费咨询')]
匹配起点关键字属性以及文本信息的节点://div[starts-with(@class,'provider')][text()='设备']
3.Xpath轴
3.1轴axes
定义所选节点与当前节点的关秀:选中某一节点作为基准节点,轴的概念相当于以选中节点作为基准节点的相对应节点集合
常用的节点关系轴关键词:(通俗的说就是相对于你,你们家的族谱)
(1)ancestor:选取当前节点的所有先辈节点,包括父节点
//li[@class = 'curp' ]/ancestor::*
//li[@class = 'curp' ]/ancestor::div[@id = 'root']
(2)ancestor-or-self:选取当前节点的所有先辈节点,包含当前节点
(3)parent:当前节点的父节点
(4)self:选取当前节点
(5)attribute:选取当前节点的所有属性
//li/attribute::class
(6)child:当前所选节点的所有子元素
(7)descendant:当前所选节点的所有后代(包括子元素)
(8)descendant-or-self:选取当前节点的所有后代(包含当前节点)
(9)following:选取当前节点结束标签后的所有节点
//div[starts-with(@class,'phone')]/following::*
(10)namespace:选取当前节点的所有命名空间节点
(11)preceding:选取当前节点的开始标签之前的所有节点
//div[starts-with(@class,'phone')]/preceding::*
(12)preceding-sibling:选取当前节点前的所有同级节点.
//div[starts-with(@class,'contentContent')]/preceding-sibling::*
3.2路径表达式
可以简单理解这是一种寻址操作,通过路径和步骤的再加上谓语的描述定位到对应的节点或位置
(1)路径:分为绝对路径(从根节点开始)和相对路径
(2)步step:使用轴定位节点的一种语法格式,轴名称::节点[谓语],一个路径表达式可以有多个步,用‘/分开’
//div[starts-with(@class,'contentContent')]/child::*/child::*
4.Xpath运算符
示例URL:https://cp.zhgcloud.com/project/projectOverview
(1)and, or 就是普通意义的and, or
(2)= 等于,!= 不等于
(3)>, >= 大于,大于等于,<, <= 小于,小于等于
(4)+, -, *, div 加减乘除
(5)mod 取模
(6)| 两个节点一起计算
//span[text()>10]
//div[@id!='rightContent']
(7)问题:
//div[not(@id='rightContent')]
和//div[@id!='rightContent']
的区别