XPath 是 HTML/XML 文档中精准定位元素的查询语言,核心为“路径+条件”:用 // 任意层级搜索更健壮,/ 表示绝对路径;优先通过属性(如 @type、@data-testid)而非 class/id 定位;文字内容(text())、位置索引([n])和轴(如 following-sibling)用于唯一区分;调试推荐 Chrome 控制台验证,Selenium 中使用 r"" 原始字符串避免转义。

XPath 是一种在 HTML 或 XML 文档中精准定位元素的查询语言,用对了,写爬虫或自动化脚本就省一半力气。它不依赖 JavaScript 渲染,也不靠肉眼找 class,核心就是“路径 + 条件”。掌握几个常用写法,就能覆盖绝大多数定位需求。
从根出发还是全文档搜?分清 / 和 //
这是最基础也最容易混淆的起点:
-
/ 表示绝对路径:必须从文档最顶层开始,比如
/html/body/div[1]/h2。一旦网页结构微调(比如加了个 wrapper div),整个表达式就失效。 -
// 表示相对任意层级搜索:跳过中间结构,直接找目标。例如
//h2找所有 h2 标签,//div//p找所有 div 内部的 p(无论嵌套几层)。 - 日常优先用
//,健壮性高;只有在结构极固定、且需唯一性约束时才考虑/。
靠属性精准锁定,别只认 class 和 id
class 名动态、id 带哈希、标签名太泛——光靠标签根本没法稳定定位。属性才是主力:
-
//input[@type='password']:找密码输入框 -
//button[contains(@class, 'primary')]:class 包含 "primary"(适配class="btn primary large") -
//*[@data-testid='submit-btn']:用自定义 data 属性,前端常预留这类稳定钩子 -
//img[@alt and not(@src)]:有 alt 但没 src 的图片,适合检测缺失资源
文字内容和位置是最后的“区分器”
当多个元素长得一模一样(比如一堆 ),就得靠内容或顺序来挑出那个唯一的:
-
//a[text()='登录']:文字完全等于“登录”的链接(注意大小写和空格) -
//span[contains(text(), '总价')]/following-sibling::b:先找到含“总价”的 span,再取它后面同级的 b 标签 -
(//div[@class='card'])[2]:括号不能少!表示“取第 2 个匹配的 div”,否则//div[@class='card'][2]含义变成“每个父节点下第 2 个 card 类 div” -
//tr[td[1]='王五']/td[3]:表格中第一列是“王五”的行,取该行第三列的内容
调试和避坑小提醒
写完别急着跑代码,先验证再集成:










