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 交给解析器,避免正文整段变乱码。