news 2026/8/12 19:29:48

100 天学会爬虫 · Day 8:如何用 XPath 高效定位网页元素?(爬虫最常用解析方式之一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
100 天学会爬虫 · Day 8:如何用 XPath 高效定位网页元素?(爬虫最常用解析方式之一)

在爬虫开发中,解析 HTML 的方式主要有三种:

  • 正则表达式(不推荐新手使用)

  • BeautifulSoup(简单易用)

  • XPath(最强大、最精确)

今天我们要学习的是爬虫工程师最喜欢的解析方式之一:

XPath —— 提取网页结构最强大的工具

只要你掌握 XPath,再复杂的 HTML 都能被你快速解析。


🔍 一、XPath 是什么?

XPath 全称:

XML Path Language(XML 路径语言)

虽然名字里带 XML,但它同样适用于HTML

它的作用是:

  • 通过路径查找节点

  • 精确定位网页元素

  • 快速提取文本、属性、子节点

你可以把 XPath 看成网页的“地图导航”:

从 /html/body/div[1]/h1 找到标题节点

非常直观、非常精确。


🧭 二、为什么爬虫必须掌握 XPath?

理由如下:

✔ 1. BeautifulSoup 不够精确

遇到多层嵌套或重复节点时,XPath 的定位能力远超 BeautifulSoup。

✔ 2. 数据结构复杂的网站,XPath 更容易处理

尤其是电商站点、资讯站点、层级列表网站。

✔ 3. XPath 语法非常统一

你学会一次,可以用一辈子。

✔ 4. lxml + XPath 的解析速度非常快

适合大规模爬虫工程。


🔧 三、用 lxml + XPath 的基础用法

安装 lxml:

pip install lxml

解析 HTML:

from lxml import etree html = etree.HTML("<html>...</html>") result = html.xpath("你的 XPath 表达式")

result会返回一个列表,包含匹配到的节点或文本。


🧪 四、XPath 常用语法(爬虫最常用 Top 10)


① 选取所有某标签节点

//h1 //div //a

② 选取具体 class 的标签

//h1[@class="title"]

③ 选取含有某部分 class 的节点(超常用)

//div[contains(@class, "item")]

适用于 class 多个值的情况:

<div class="item active main">

④ 选取文本内容

//h1/text()

⑤ 选取属性(如 src、href)

//img/@src //a/@href

⑥ 索引定位(从 1 开始)

//ul/li[1] # 第一个 li //ul/li[last()] # 最后一个 li

⑦ 选取子节点(/)

//div/h1

⑧ 选取任意深度节点(//)

//div//span

⑨ 选取包含文本的节点

//a[contains(text(), "Python")]

⑩ 多条件筛选(进阶)

//div[@class="item" and @data-id="123"]

🔍 五、实战示例:解析文章标题与内容

假设你抓取一个网页,结构如下:

<div class="article"> <h1 class="title">Python 爬虫入门</h1> <p class="summary">这是简介内容</p> </div>

XPath 提取:

提取标题:

title = html.xpath('//h1[@class="title"]/text()')

提取简介:

summary = html.xpath('//p[@class="summary"]/text()')

提取整个文章块:

article = html.xpath('//div[@class="article"]')[0]

🧩 六、解析列表结构(爬虫最常见场景)

网页中常见:

新闻列表
商品列表
评论列表
视频列表
结构可能是:

<ul class="news"> <li> <a href="/1.html">新闻 1</a> </li> <li> <a href="/2.html">新闻 2</a> </li> </ul>

提取所有标题:

titles = html.xpath('//ul[@class="news"]/li/a/text()')

提取所有链接:

links = html.xpath('//ul[@class="news"]/li/a/@href')

XPath 对列表解析极其强大。


🛠 七、如何在浏览器中获取 XPath?

Chrome 可以自动生成 XPath:

  1. 打开 Elements 面板

  2. 右键节点

  3. 点击Copy → Copy XPath

但注意:

  • 自动 XPath不够简洁

  • 很多路径层级过深

  • 建议自行优化

例如自动生成:

/html/body/div[2]/div[3]/div/h1

建议手写:

//h1[@class="title"]

更通用、更不易失败。

🔦 八、XPath 解析失败的常见原因


❌ 1. 页面由 JS 渲染(HTML 中没有数据)

此时应抓 Ajax 或使用 Selenium/Playwright。


❌ 2. class 有多个值,你却写成完整匹配

例如:

<div class="item active">

应写:

//div[contains(@class, "item")]

❌ 3. 标签层级不固定

//更稳妥。


❌ 4. 忘记加 text() 或 @href


✅ 总结

今天你学到了:

  • XPath 是最强大的 HTML 解析工具之一

  • 支持精确定位节点、属性、文本

  • 非常适合爬虫解析复杂网页

  • Chrome 可以辅助生成 XPath

  • XPath 常见的十大语法

  • XPath 在列表结构中的应用

  • XPath 失败的常见原因及解决方案

掌握 XPath 是你成为爬虫开发者的重要里程碑,一旦熟练,再复杂的页面都能迎刃而解。

如果你在写 XPath 时遇到:

  • 结构太复杂难以定位

  • 多层嵌套不知如何写路径

  • text() 提取不到内容

  • Chrome 生成的 XPath 不能用

  • 每个节点结构都不固定

可以加我微信cpseagogo,我可以帮你一起分析 HTML 结构和 XPath 写法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/11 4:59:10

为什么顶尖团队都在用Docker部署Vercel AI SDK?深度解析三大技术优势

第一章&#xff1a;Docker 与 Vercel AI SDK 的集成部署将 Docker 与 Vercel AI SDK 集成&#xff0c;能够实现 AI 应用的容器化部署&#xff0c;提升开发环境的一致性与服务的可移植性。通过容器封装&#xff0c;开发者可以在本地模拟生产环境&#xff0c;确保模型推理服务在不…

作者头像 李华
网站建设 2026/8/12 9:29:28

C语言----三子棋

三子棋游戏实现思路三子棋是一种简单的棋盘游戏&#xff0c;玩家轮流在3x3的格子中放置棋子&#xff0c;先连成一条直线&#xff08;横、竖、斜&#xff09;的一方获胜。以下是C语言实现的核心逻辑。初始化棋盘使用二维数组表示棋盘&#xff0c;初始时每个位置设为空格&#xf…

作者头像 李华
网站建设 2026/8/11 12:55:40

【专家亲授】Docker Offload架构设计精髓:打造弹性云环境的7个步骤

第一章&#xff1a;Docker Offload架构的核心理念 Docker Offload架构是一种将容器化工作负载从主运行环境卸载至边缘或专用执行节点的设计模式&#xff0c;旨在提升资源利用率、降低主系统负载并优化服务响应延迟。该架构通过智能调度机制&#xff0c;识别可迁移的容器任务&am…

作者头像 李华
网站建设 2026/8/11 13:52:58

AI智能改写助力:精选7款论文查重工具及可视化报告生成

工具名称 查重速度 数据库规模 高亮功能 适用场景 价格区间 aibiye 3-5分钟 10亿文献 多色高亮修改建议 学术论文/毕业论文 中档 aicheck 5-8分钟 8亿文献 智能分类高亮 期刊投稿/职称论文 中高档 askpaper 2-3分钟 5亿文献 基础高亮 课程作业/初稿检测 …

作者头像 李华
网站建设 2026/8/11 9:57:06

LeetCode热题100--739. 每日温度--中等

题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输入: tem…

作者头像 李华