XPath 语法【Web 自动化-定位方法】

发布于:2025-07-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

🧭 XPath 语法简介(Web 自动化核心定位手段)

一、XPath 是什么?

  • XPath(XML Path Language)是用于在 XML/HTML 文档中定位节点的语言,由 W3C 标准定义。
  • 浏览器支持的是 XPath 1.0
  • 应用场景广泛:用于 SeleniumScrapy 爬虫Appium 移动自动化 等。

二、XPath 与 CSS 对比

特性

CSS Selector

XPath

向上选父节点

❌ 不支持

✅ 支持 /..

向前选兄弟节点

❌ 不支持

preceding-sibling::

根据属性部分匹配

^= *=

starts-with() contains()

结构匹配表达力强

中等

非常强大


三、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 常用关键字/函数速查表

表达式

含义

/

绝对路径或直接子节点

//

相对路径或任意后代节点

*

通配符,匹配任意标签

[@attr='value']

根据属性精确匹配

contains(@attr, xxx)

属性包含子串

starts-with(@attr, x)

属性以字符串开头

position()

子元素的位次

last()

最后一个子元素位置

/..

父节点

preceding-sibling::*

前兄弟节点

following-sibling::*

后兄弟节点

`

`

组选择


网站公告

今日签到

点亮在社区的每一天
去签到