入门

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

  • 当前节点开始标签之前所有节点。
  • 当前节点开始标签之前所有同级节点。

下一篇:影刀进阶:用XPath选择元素的应用