🧭 XPath 语法简介(Web 自动化核心定位手段)
一、XPath 是什么?
- XPath(XML Path Language)是用于在 XML/HTML 文档中定位节点的语言,由 W3C 标准定义。
- 浏览器支持的是 XPath 1.0。
- 应用场景广泛:用于 Selenium、Scrapy 爬虫、Appium 移动自动化 等。
二、XPath 与 CSS 对比
特性 |
CSS Selector |
XPath |
向上选父节点 |
❌ 不支持 |
✅ 支持 |
向前选兄弟节点 |
❌ 不支持 |
✅ |
根据属性部分匹配 |
✅ |
✅ |
结构匹配表达力强 |
中等 |
非常强大 |
三、XPath 基本语法
1️⃣ 绝对路径(从根节点开始)
/html/body/div
等同于 CSS:html > body > div
2️⃣ 相对路径(常用)
//div
表示从任意位置开始,选择所有的 div
元素。//
类似 CSS 的后代选择器空格。
3️⃣ 子元素选择
//div/p # 直接子元素
//div//p # 任意后代元素
4️⃣ 通配符 *
//div/* # div下所有直接子节点
四、按属性选择元素
基础语法
//*[@属性名='属性值'] # 注意 @ 符号和引号
示例
//*[@id='west']
//*[@class='capital huge-city']
⚠️ class 为多个值时,必须匹配完整。
存在属性(不要求值)
//*[@multiple] # 选择有 multiple 属性的所有元素
属性部分匹配
//*[contains(@style, 'color')] # 包含 color
//*[starts-with(@style, 'color')] # 以 color 开头
⚠️ ends-with()
是 XPath 2.0,不被浏览器支持。
五、按位置/顺序选择
第 N 个某类元素
//p[2] # 所有 p 中的第 2 个
//div/p[2] # div 下的 p 中第 2 个
第 N 个任意子元素
//div/*[2]
倒数第几个
//p[last()] # 最后一个 p
//p[last()-1] # 倒数第二个
//div/p[last()-2] # div 中 p 的倒数第三个
范围选择
//option[position()<=2]
//*[@class='multi_choice']/*[position()>=last()-2]
六、组合选择、父节点与兄弟节点
组选择(或运算)
//option | //h4
//*[@class='a'] | //*[@class='b']
父节点选择
//*[@id='china']/..
可以用于先选子,再回到父节点。
兄弟节点选择
//*[@class='single_choice']/following-sibling::* # 后续兄弟
//*[@class='single_choice']/preceding-sibling::*[1] # 前一兄弟
CSS 仅支持后续兄弟(~
),不支持前兄弟选择。
七、Selenium 中使用 XPath 的注意点
1️⃣ 基本用法
driver.find_elements(By.XPATH, "//div")
2️⃣ 在 WebElement 内部查找子节点时要加 .
china = driver.find_element(By.ID, 'china')
elements = china.find_elements(By.XPATH, './/p') # 必须加点
如果不加 .//
,会从整个 DOM 根节点开始查找,而不是从当前元素。
✅ 小结:XPath 常用关键字/函数速查表
表达式 |
含义 |
|
|
绝对路径或直接子节点 |
|
|
相对路径或任意后代节点 |
|
|
通配符,匹配任意标签 |
|
|
根据属性精确匹配 |
|
|
属性包含子串 |
|
|
属性以字符串开头 |
|
|
子元素的位次 |
|
|
最后一个子元素位置 |
|
|
父节点 |
|
|
前兄弟节点 |
|
|
后兄弟节点 |
|
` |
` |
组选择 |