首页/AI/RAG 与向量库速查/BeautifulSoup 解析 HTML 结构

BeautifulSoup 解析 HTML 结构

BeautifulSoup 按 CSS 选择器或标签树遍历网页结构,适合规则明确的目标页抓取(如文档站目录、FAQ 列表),配合 lxml 解析器速度较快。

RAG 与向量库速查AI更新于 2026-10-13

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 与抓取时间作为元数据,否则后期无法回溯内容对应的线上版本。

易错点

  • 用正则解析 HTML,嵌套标签与属性顺序一变就漏数据
  • 忽略编码声明得到乱码,中文内容全部不可用
  • 未清理 script 与 style 节点,正文里混入脚本片段
  • 选择器写死且无失效检测,站点改版后静默抓到空内容
  • 只抓正文不抓标题与面包屑,切片缺少上下文,检索时无法定位来源章节

数据来源与参考

  • Beautiful Soup 官方文档(crummy.com/software/BeautifulSoup)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌