
入门

1、从根节点选取 a 标签
/html/body/div/ul/li/a
2、跨节点选取 a 标签
//a
//li/a
/html//a
3、通过属性选择第四个 a 标签
//a[@href="www.4.com"]
4、通过索引选择第三个 a 标签
//a[3]
辅助插件 XPath helper
XPath helper,快速验证 XPath 是否正确。

XPath 基础
用 XPath 选取元素,不易失效的两大优秀:灵活、稳定。

//
//
跨节点选择//a
跨节点选取 a 标签
/
/
从根节点一级一级选择/html/body/div/ul/li/a
从根节点选取 a 标签
@
@
根据属性来定位span[@id]
查找有id属性的span标签span[@class="name"]
查找class属性为name的标签//div/a[@id]
查找 div 标签的子标签中有id属性的a标签
text()
text()
根据文本值定位span[text()="首页"]
查找文本值为首页的span标签
*
*
通配符,表示任何标签或属性span[@*]
表示任何有属性的span标签//div/*
表示div标签下的所有标签
. 和 ..
.
当前节点..
当前节点的父节点//div/a[1]/..
表示div下第1个a标签的父标签div
[1]
[数字]
位置索引(从1开始计数)//div/a[1]
表示div标签下第1个a标签//div[1]/a[3]
表示第1个div中的第3个a标签
last()
last()
定位最后一个节点(不能用-1)//div/a[last()]
div标签下最后一个a标签//div/a[last()-1]
div标签下倒数第二个a标签
position()
position()
表示索引值//div/a[position()<4]
索引值小于4,表示前3个标签
运算符
包含算数运算符、比较运算符、逻辑运算符和联合运算符。
算数运算符
算数运算符:+ 加 - 减 * 乘 div 除 mod 取余
//div[a div 2 = 1]
表示div中除以2等于1的a标签(第2个)//div[a mod 2 = 1]
表示div中除以2的余数为1的a标签(第1、3、5个)
比较运算符
比较运算符:= != < <= > >=
逻辑运算符: and or not
//div[a mod 2=1 and a > 3]
表示除以2余数为1(1,3,5个),且大于3的a标签(第5个)//div[a mod 2=1 or a > 3]
表示除以2余数为1(1,3,5个),且大于3的a标签(4,5个),结果是(1,3,4,5个)//div[a mod 2=1 not(a > 3)]
取反标示a小于3//div[not(@class="name")]
取反标示class不为name的div标签
联合运算符
多个表达式取并集,又叫并集运算符。
//a[1] | //a[3]
表示同时选择第1个a标签和第3个a标签- 并集|和or的区别:并集连接多个表达式,而or连接多个限制条件。
函数
XPath有一百多个函数,常用的如下。
contains() 模糊匹配
有些class的属性值不变化,只有部分不变。
//a[contains(@class, "name")]
模糊匹配class属性值包含name的a标签calss="name"
可以匹配calss="zy_name_xzz"
可以匹配calss="name_1_xzz"
可以匹配//li/a[contains(text(), "长沙")]
模糊匹配文本值包含“长沙”的a标签- 列表中包含“长沙”的都会选择(text()表示文本值)
starts-with() 以…开头
//a[starts-with(@class, "name")]
模糊匹配class属性值以name开头的a标签
ends-with() 以…结尾
//a[contains(@class, "name")]
模糊匹配class属性值以name结尾的a标签
string() 文本匹配
text()函数获取的是当前标签的文本,string()可以获取当前标签和所有后代标签的文本。
//li/a[contains(string(), "长沙")]
模糊匹配包含“长沙”的a标签和所有后代标签//li/a[contains(text(), "长沙")]
模糊匹配包含“长沙”的a标签
轴
根据标签间的层级关系来选择标签的一种方式。
child
- 选取当前节点的所有子节点。
//li/child::a
li标签下所有为a的子节点//li/child::*
li标签下所有子节点
descendant
- 选取当前节点的所有后代节点。
parent
- 选取当前节点的父节点。
..
也表示当前节点的父节点,区别在于:parent能限制父节点的类型。//li/a/..
选取a标签的所有父标签//li/a/parent::li
选取a标签的li父标签
ancestor
- 选取当前节点的所有祖父节点。
following 和 following-sibling
- 当前节点
结束标签之后
所有节点。 - 当前节点
结束标签之后
所有同级
节点。
preceding 和 preceding-sibling
- 当前节点
开始标签之前
所有节点。 - 当前节点
开始标签之前
所有同级
节点。
