BeautifulSoup 是什么
BeautifulSoup 是 Python 的 HTML/XML 解析库:把文档解析成节点树后,用 CSS 选择器或标签遍历取出需要的文本与属性。它适合结构规整、规则明确的目标页——文档站的目录、FAQ 列表、帮助中心的条目页。选择器依赖页面结构,站点改版就会失效,因此批量抓取要先设计失败检测与重跑机制,并在抓取前确认目标站点的抓取条款与 robots 约定。
基本信息
| 解析器 | lxml(快)、html.parser(内置)、html5lib(容错强但慢) |
|---|---|
| 定位方式 | select 走 CSS 选择器,find/find_all 按标签与属性 |
| 取文本 | get_text(separator, strip=True) 拼接子节点文本 |
| 编码 | 优先显式指定编码,或用响应头声明的编码 |
| 风险 | 选择器随页面改版失效 |
典型使用场景
- 文档站正文抽取:定位主内容容器,排除导航与侧边栏
- FAQ 列表抓取:一问一答成对提取,直接构造切片
- 目录结构发现:从导航里取链接,作为后续抓取的入口清单
- 页面改版回归:固定选择器列表并做每日抽检,失效即告警
- 与解析工具配合:HTML 抽出的正文再进切分与向量化流程
选择器提取
选择器提取
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('page.html', encoding='utf-8').read(), 'lxml')
for p in soup.select('article p'):
print(p.get_text(' ', strip=True))
for a in soup.select('nav a[href]'):
print(a['href'], a.get_text(strip=True))
for tag in soup.select('script, style'):
tag.decompose() # 先清掉脚本与样式再取正文解析器取舍
| 解析器 | 速度 | 特点 |
|---|---|---|
| lxml | 快 | 需要额外依赖,容错性较好 |
| html.parser | 中 | 标准库自带,无需安装 |
| html5lib | 慢 | 按浏览器规则容错,脏 HTML 更稳 |
| 正则表达式 | 快 | 嵌套结构极易出错,不推荐 |
抓取链路的稳定性设计
- 选择器集中管理:把 CSS 选择器写成配置文件,改版时只改一处
- 空结果告警:抽出正文长度为零即视为异常,立刻停止并通知
- 限速与重试:对同一站点控制请求频率,失败按退避策略重试
- 增量更新:按 URL 与内容指纹判断是否变化,只重抓变更页面
抓取前先确认目标站点的条款与 robots 约定;解析结果要保留来源 URL 与抓取时间作为元数据,否则后期无法回溯内容对应的线上版本。