首页/AI/RAG 与向量库速查/readability-lxml 抽取正文

readability-lxml 抽取正文

readability-lxml 根据内容密度启发式提取网页正文(源自 Readability 思路),适合新闻与博客类文章;输出为 HTML 片段,可再转纯文本。

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

readability-lxml 是什么

readability-lxml 是 Python 的网页正文抽取库,算法思路移植自 Mozilla 的 Readability:先把 HTML 解析成块级节点,逐块统计文本长度与链接密度,分值最高的容器判为正文,再回吐该容器的 HTML 片段。它解决的是「一页里正文只占一小块,其余是导航、推荐、页脚」的清洗问题,对新闻页、博客、帮助中心、公告这类正文型页面效果最好。输出保留 HTML 而不是纯文本,是为了不丢段落、列表、代码块等结构,方便后面切分与渲染。

基本信息

安装pip install readability-lxml,依赖 lxml
运行环境Python 3,本地库,无外部服务
输入HTML 字符串,bytes 需先解码
输出title() 标题文本;summary() 正文 HTML 片段
适用页面正文型文章页:新闻、博客、帮助中心、公告
不适用列表页、搜索结果页、纯结构化数据页

典型使用场景

  • 语料清洗:批量抓回的网页先去导航与广告,再入库切片
  • 帮助中心转知识库:抽取产品文档正文,作为 RAG 数据源
  • 抓取结果留档:只保存正文片段,降低存储与后续解析开销
  • 去重前的归一:剥离模板后再比正文相似度,重复判定更可靠
  • 与 trafilatura 互为校对:两者差异明显的页面转人工复核

最小可用示例

最小可用示例
from readability import Document      # 引入正文抽取类
import requests

html = requests.get(url, timeout=10).text   # 抓取页面源码
doc = Document(html)                        # 构建文档对象
print(doc.title())                          # 标题:纯文本
summary = doc.summary()                     # 正文:HTML 片段
print(len(summary), summary[:300])          # 看长度与前 300 字判断是否抽对
# 需要纯文本时交给 lxml 去标签,再写回知识库切片

抽取结果读法

输出形式抽对的判断
title()标题纯文本与页面标题一致;为空或乱码多为编码识别错误
summary()正文 HTML 片段含正文段落;只剩导航链接说明算法判错
content未清洗的容器 HTML摘要异常时可从这里看算法选中了哪一块
长度字符数文章类通常数百到数千字,个位数基本等于失败
summary() 返回的仍是 HTML:入库前必须去标签,否则标签会混进切片参与向量化,稀释语义并拉低检索相关性。
编码要先处理:requests 的 text 属性可能猜错编码,先行校验页面声明的编码,或直接按 bytes 交给解析器,避免正文整段变乱码。

易错点

  • 把 summary() 直接当纯文本入库:HTML 标签进入 embedding,相似度被标签噪声拉偏,检索命中明显变差
  • 对列表页、商品页套用同一流程:抽出的所谓正文其实是导航与推荐位文字,下游切分与索引全部失真
  • 抽取返回空字符串时不告警:静默写入空片段,直到检索答非所问才被发现
  • 只用一种抽取库又不做一致性校验:站点改版导致抽取整体失效时没人察觉,语料质量断崖式下降

数据来源与参考

  • readability-lxml 项目文档(github.com/buriy/python-readability)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌