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 带哈希、标签名太泛——光靠标签根本没法稳定定位。属性才是主力:
//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]:表格中第一列是“王五”的行,取该行第三列的内容写完别急着跑代码,先验证再集成:
find_element(By.XPATH, r"//div[@data-id='100']"),推荐原始字符串 r"" 避免反斜杠转义问题//a[@title="编辑 用户"];反之亦然[3]),优先用文本、属性或语义化条件替代