单元 2 · 数据解析 — 预计 40 分钟

XPath 解析

📍 本课路径40 分钟 · 4 个目标
  1. 理解 XPath 路径语法(/ // [] @)
  2. 用 lxml.html 解析并用 xpath() 提取
  3. 掌握文本提取与属性定位
  4. 能在 XPath 与 CSS 选择器之间做取舍
🎯 学习节奏:① 看目标 → ② 先思考再动手 → ③ 在运行器写代码 → ④ 失败时按提示重试 → ⑤ 通过后看思路

XPath(XML Path Language)原本是为在 XML 文档里定位节点而设计的,因为它能表达层级关系、谓词过滤、轴(父子/兄弟),在复杂页面上比 CSS 选择器更灵活。爬虫里我们通常用 lxml 这个高性能解析库来执行 XPath。

一、XPath 路径语法

XPath 用「路径」描述你要找的节点,核心符号只有四个:

符号 含义 示例
/ 从根节点开始的直接子级 /html/body/div
// 从当前节点开始任意层级后代 //div(页面所有 div)
[] 谓词(过滤条件) //li[@class='book'](class 为 book 的 li)
@ 属性 //a/@href(所有链接的 href)

还有几个高频用法:

⚠️ 和 CSS 不同,XPath 的索引从 1 开始,且 // 表示「后代」而非「当前层级」。

二、用 lxml 解析

lxml.html.fromstring() 把 HTML 字符串变成可查询的文档对象,再用 .xpath("表达式") 提取,返回字符串列表(对 text()/@属性)或元素列表(对标签)。

下面需要你补全 XPath 提取逻辑——给定一段 HTML,用 XPath 同时取出书名和链接:

三、文本提取与属性定位

再来一个练习——这次 class 属性是多值的(book hot),精确匹配会漏掉,你需要用 contains:

四、XPath 与 CSS 选择器怎么选

维度 CSS 选择器 XPath
语法直观度 简单场景更顺手 路径式,稍陡
层级/轴 较弱(只能后代/子) 强(parent::following-sibling::)
按文本过滤 不支持 支持 contains(text(),...)
按属性模糊 [class*='book'] [contains(@class,'book')]
取父/兄弟 不方便 原生支持
性能 略快(lxml 下)

经验法则:

五、小结

本页底部的「代码实战」会让你在靶站上用 XPath 完成一次真实提取。