XPath 的工作原理
XPath 将 XML 文档或解析后的 HTML 页面视为一棵节点树。表达式用于描述穿过这棵树的路径,可按元素名称、属性、位置、文本,以及父节点、兄弟节点等关系选择节点。
HTML: <article data-id="42"><h2><a>Blue Widget</a></h2></article>
XPath: //article[@data-id="42"]/h2/a/text()
结果: Blue Widget
这里,//article 会查找文档中任意位置的 article 元素。[@data-id="42"] 按属性筛选,text() 则选择链接的文本节点。
在网页采集中使用 XPath
网页采集工具会先下载或渲染页面,再由解析器在生成的文档树上计算 XPath 表达式,并将选中的值传给数据解析代码。
XPath 不会获取页面、执行脚本或产生网络流量。加载页面前,应在 HTTP 客户端、爬虫或浏览器中配置代理。如果内容只有经过 JavaScript 渲染才会显示,应在浏览器渲染后的 DOM 上执行 XPath,而不是针对初始 HTML 响应执行。
XPath 与 CSS 选择器
两者都能从 HTML 中选择内容,但导航能力有所不同。
| 功能 | XPath | CSS 选择器 |
|---|---|---|
| 基础选择 | 元素和属性节点 | 按标签、类、ID 或属性选择元素 |
| 导航 | 沿树向下、向上或横向导航 | 主要选择后代节点和兄弟节点 |
| 文本匹配 | 支持文本谓词 | 通常不支持 |
| 最适合 | 按结构或文本查询 | 按类、ID 和属性查询 |
对于简单目标,CSS 选择器通常更易读。必须根据元素的文本、父节点或祖先节点进行查找时,XPath 更实用。
如何编写可靠的 XPath
- 优先使用稳定的属性。 使用
id、data-*或有明确含义的 class 值,而不是元素的视觉位置。 - 避免过长的绝对路径。
/html/body/div[2]/div[3]这类表达式会在页面新增一层容器后失效。 - 限定查询范围。 先定位商品卡片或表格行,再选择其中的价格或链接。
- 处理缺失和重复节点。 测试表达式返回零个、一个或多个结果时的情况。
- 检查实现支持情况。 浏览器通常支持 XPath 1.0,而 XML 工具可能支持更新版本。
常见问题
XPath 能用于 HTML 吗?
能。浏览器和采集库会将 HTML 解析成 XPath 可以查询的文档树,尽管 XPath 最初是为 XML 数据模型设计的。
为什么 XPath 在浏览器里能用,在采集工具里却不行?
浏览器可能已经渲染了 JavaScript,或者采用了不同方式修复无效 HTML。可将采集工具解析出的文档与页面的实时 DOM 进行比较,并检查目标是否位于 iframe 中。
XPath 能通过代理发送请求吗?
不能。XPath 只能从已有文档中选择节点。应在加载页面的 HTTP 客户端或浏览器中设置代理,再对返回的内容执行 XPath。