XPath笔记

XPath(XML Path Language,XML 路径语言)是一种用于在 XML 或 HTML 文档中定位和选取节点的查询语言 ,由 W3C(万维网联盟)制定为标准。它的核心思想是把文档看作一棵节点树,像文件系统的路径一样,在树中导航并精准定位目标元素。

一、核心基础:节点选取语法

这是 XPath 定位的底层规则,用于指定节点的查找路径,是所有操作的基础:

表格

表达式 核心描述 实战示例 示例说明
nodename 选取该节点的所有子节点 div 选取当前节点下所有<div>子标签
/ 层级分隔 / 绝对路径(直接子节点) /html/body/div 从根节点开始,选<html>→<body>下的直接<div>子节点
// 全局选取(任意位置的节点) //div 选取整个文档中所有<div>标签(无视层级)
. 选取当前节点(相对定位) ./span 选取当前节点下的直接<span>子节点
.. 选取父节点 //span/.. 选取所有<span>标签的父节点
@ 选取属性(基础) //div[@id] 选取带有id属性的所有<div>标签

二、进阶筛选:谓语(Predicates)

通过[]包裹条件实现精准过滤,是 XPath 定位的核心能力,适配各类精准匹配场景:

表格

表达式类型 示例 示例说明 补充说明
位置索引 //head/meta[1] 选取<head>下第一个<meta>标签 索引从 1 开始(非 0),是高频易错点
末尾定位 //ul/li[last()] 选取<ul>下最后一个<li>标签 支持偏移:last()-1= 倒数第二个
位置范围 //ul/li[position()<3] 选取<ul>下前 2 个<li>标签 支持</>/=/<=/>=等运算符
属性存在性 //a[@href] 选取带有href属性的所有<a>标签 仅校验属性是否存在,不限制值
属性精确匹配 //div[@id='u1'] 选取id值为u1的所有<div>标签 字符串值需加单 / 双引号
属性模糊匹配 //a[contains(@href, 'cve')] 选取href包含cve的所有<a>标签 爬虫提取关联链接常用
属性开头匹配 //script[starts-with(@src, '//cdn')] 选取src以//cdn开头的<script> 定位第三方资源常用
多条件联合 //input[@type='text' and position()=2] 选取第 2 个type为text的<input> 支持and/or逻辑运算符

三、简化匹配:通配符(Wildcards)

用于 "未知节点 / 属性" 或批量选取场景,简化匹配规则:

表格

通配符 作用 示例 示例说明
* 匹配任意节点 //div[@id='u1']/* 选id=u1的<div>下所有直接子节点(不限标签)
@* 匹配任意属性 //meta[@*] 选取带有任意属性的所有<meta>标签

四、批量选取:多路径联合(| 竖线)

你希望我重新整理 XPath 中 "多路径联合选取" 的知识点,这是 XPath 实现批量提取多个不相关节点集的核心能力,以下是结构化、贴合实战的详细解析:

1. 核心语法

多路径联合选取通过 |(竖线) 连接两个或多个独立的 XPath 表达式,最终返回所有表达式匹配结果的 "并集"(按节点在文档中的自然出现顺序排列)。

  • 语法格式:XPath表达式1 | XPath表达式2 | ... | XPath表达式N
  • 核心逻辑:多个路径无依赖关系,相当于 "同时选取满足任意一个路径的所有节点"。

2. 详细示例(从基础到进阶)

(1)基础示例:选取不同类型的标签

xpath

复制代码
//title | //meta | //h1
  • 作用:同时选取文档中所有<title>、<meta>和<h1>标签;
  • 适用场景:爬虫中批量提取网页基础信息(标题、元信息、主标题)。

(2)进阶示例:带筛选条件的多路径

xpath

复制代码
//div[@class='nav']/a | //ul[@id='menu']/li/a
  • 作用:
    • 第一部分:选取class="nav"的<div>下所有<a>标签;
    • 第二部分:选取id="menu"的<ul>下所有<li>中的<a>标签;
    • 最终:合并两部分结果,得到所有导航栏链接。
  • 适用场景:网页导航链接分散在不同标签结构中时,批量提取所有导航链接。

(3)结合谓语 / 通配符的多路径

xpath

复制代码
//a[contains(@href, 'https')] | //button[@type='submit']
  • 作用:同时选取所有带 HTTPS 链接的<a>标签、所有提交类型的<button>标签;
  • 适用场景:自动化测试中批量定位 "安全链接" 和 "提交按钮"。

3. 关键使用注意事项

  1. 结果排序 :合并后的节点按其在文档中的自然出现顺序 排列,而非表达式书写顺序;例:若<h1>在<title>前,//title | //h1的结果中<h1>会先出现。
  2. 路径独立性 :每个路径都是独立的,一个路径的语法错误会导致整个表达式失效;例://div[@class='nav'] | //ul[@id='menu'(缺少闭合括号)会整体报错。
  3. 去重特性 :若多个路径匹配到同一个节点,结果中仅保留一次(自动去重);例://div | //*[@class='box']若某个<div>刚好有class="box",只会出现一次。

五、实战补充:路径类型与避坑指南

1. 路径类型区分(爬虫 / 自动化首选)

  • 绝对路径:以/开头(如/html/body/div),稳定性差(页面结构变化易失效);
  • 相对路径:以./..开头(如./span),灵活性高(优先使用);
  • 全局路径:以//开头(如//div[@class='content']),兼顾精准与灵活。

2. 核心易错点

  • 索引规则:XPath 索引从 1 开始,而非编程中的 0;
  • 通配符范围:*仅匹配节点,@*仅匹配属性,不可混用;
  • 多路径逻辑:|是 "并集" 而非 "逻辑或",结果按文档顺序返回。

总结

  1. XPath 核心分为基础路径选取 (/、//、.、@)和进阶筛选(谓语、通配符、多路径),后者是精准定位的关键;
  2. 谓语[]支持位置、属性、多条件筛选,"索引从 1 开始" 是最易踩坑的点;
  3. 实际开发中优先使用「相对路径 + 谓语筛选」(如//div[@class='content']/p),兼顾灵活性和精准性。
相关推荐
波力海苔夹心脆6753 分钟前
C# StringBuilder 详解:字符串拼接为什么总说要用它?
开发语言·笔记·c#·.net·字符串·stringbuilder·入门教程
weixin_448119944 分钟前
Datawhale DeepSeek Harness 技术入门与架构原理 笔记3
笔记·架构
果壳science13 分钟前
关于光子、量子猜想
笔记·科技·学习·创业创新·学习方法
愤怒火龙果29 分钟前
蓝队笔记整理01 C2 远控与 Webshell 流量特征
笔记·网络安全
丑梨数据1 小时前
法律合同知识库怎么搭:从图片压缩到私有化 RAG 的工程笔记
开发语言·笔记·c#
江屿风1 小时前
【Plain Language Large Model】【大语言模型底层原理全解析:从Token生成到智能体演进】流食般投喂
人工智能·笔记·语言模型·llm·json·token·聊天模板
Z21-X1 小时前
云原生运维学习笔记:揭开虚拟化的硬核面纱,从底层架构到KVM实战
运维·笔记·学习·云原生
深圳老胡1 小时前
STM32C5A3ZG开发板:基于STM32CubeMX与VSCode的按键检测与LED闪烁实战
笔记·stm32·单片机·代码规范
天疆说1 小时前
DeepSeek 开源学习中心公开课调研笔记
笔记·学习·开源
Rabitebla2 小时前
【Linux】 权限篇(三):深入理解 umask 位运算与粘滞位的设计思想
java·linux·服务器·c++·笔记·学习