精准提取:正文、元数据与表格——Trafilatura 提取能力详解
Trafilatura 的核心提取算法、可提取字段、与主流提取库的 benchmark 对比,以及如何获取最佳提取结果。
亿牛云技术团队2026年4月25日3 分钟阅读
Trafilatura 的提取引擎
Trafilatura 的正文提取结合了三种策略:
- 基于 HTML 结构的算法——分析 DOM 树中的文本密度、标点符号比例、链接文本比例,找到最可能的"正文区域"
- jusText 算法——启发式文本分类,将 HTML 块分为"正文"、"噪声"、"标题"等类别
- 回退到 readability——当上述策略无法确定正文区域时,使用经典的 readability 算法兜底
这种多引擎设计让 Trafilatura 在不同类型的网页上都有稳定的表现。
可提取字段
import trafilatura
downloaded = trafilatura.fetch_url("https://example.com/article")
result = trafilatura.extract(
downloaded,
output_format="json",
with_metadata=True,
include_tables=True,
include_comments=True,
include_formatting=True,
include_images=True,
include_links=True,
)
| 字段 | JSON 键 | 来源 |
|---|---|---|
| 标题 | title | <title> / <h1> / OpenGraph |
| 作者 | author | <meta name="author"> / 文章署名 |
| 发布日期 | date | <time> / <meta date> / URL 日期 |
| 分类 | categories | 面包屑导航 / <meta> |
| 标签 | tags | 文章标签 / <meta keywords> |
| 正文 | text | 提取算法计算的主内容区域 |
| 评论 | comments | 评论区文本(需 include_comments=True) |
| 表格 | tables | HTML <table> 元素(需 include_tables=True) |
| 图片 | images | 图片 alt 文本和 URL(需 include_images=True) |
元数据提取示例
import json
import trafilatura
downloaded = trafilatura.fetch_url("https://example.com/article")
result = trafilatura.extract(downloaded, output_format="json", with_metadata=True)
data = json.loads(result)
print(f"标题: {data['title']}")
print(f"作者: {data['author']}")
print(f"日期: {data['date']}")
print(f"分类: {', '.join(data['categories'])}")
print(f"标签: {', '.join(data['tags'])}")
Benchmark 对比
Trafilatura 在多个公开 benchmark 中持续领先。以下是各库在 ScrapingHub 文章提取 benchmark 中的表现:
| 库 | F1 分数 | 精确率 | 召回率 | 维护状态 |
|---|---|---|---|---|
| Trafilatura | 0.92 | 0.94 | 0.90 | 活跃 |
| readability-lxml | 0.78 | 0.82 | 0.75 | 低 |
| newspaper3k | 0.71 | 0.68 | 0.75 | 停滞 |
| boilerpy3 | 0.75 | 0.80 | 0.71 | 低 |
| jusText | 0.73 | 0.70 | 0.77 | 低 |
数据来源:ScrapingHub article-extraction-benchmark,Bevendorff et al. 2023 实证研究,Lejeune & Barbaresi 2020 评估。
为什么 Trafilatura 领先
- 多策略融合:单一算法在某个站点失效时,其他算法兜底
- 持续维护:2021 年发布以来一直有更新,适配现代 HTML 结构
- 元数据提取:其他库大多只提取正文,Trafilatura 同时提取 6+ 项元数据
- 格式支持:输出格式最丰富(6 种格式),降低后续处理成本
表格提取
Trafilatura 可以提取并结构化输出 HTML 表格:
import trafilatura
downloaded = trafilatura.fetch_url("https://example.com/data-page")
result = trafilatura.extract(downloaded, output_format="json", include_tables=True)
在 Markdown 输出中,表格会转换为 Markdown 表格语法;在 JSON 输出中,表格作为结构化数组保存。
提取调优
针对特定站点的策略
对于某些站点,默认参数可能不够理想。可以通过调整以下参数优化:
# 对于正文较短的文章,降低最小文本长度阈值
result = trafilatura.extract(
downloaded,
output_format="txt",
no_fallback=False, # 允许回退到 readability
include_tables=True,
include_formatting=True,
target_language="zh", # 如果已知目标语言
url="https://example.com/article", # 用于 URL 级别的提取决策
)
处理非标准页面
# 对于评论丰富的页面(如论坛)
result = trafilatura.extract(
downloaded,
include_comments=True,
deduplicate=True, # 去重重复段落
)
# 对于多作者页面
result = trafilatura.extract(
downloaded,
with_metadata=True,
include_comments=False,
)
配合代理获取最佳结果
提取质量依赖于 HTML 完整性。如果请求被 CDN 拦截或返回降级页面,提取结果必然不准确。
import requests
import trafilatura
session = requests.Session()
session.proxies = {
"http": "http://user:pass@proxy.16yun.cn:8888",
"https": "http://user:pass@proxy.16yun.cn:8888",
}
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
resp = session.get("https://example.com/article")
resp.encoding = "utf-8"
result = trafilatura.extract(resp.text, output_format="markdown", with_metadata=True)
用 16YUN 爬虫代理的住宅 IP 可降低被 CDN 拦截的概率,确保获取到完整的 HTML 内容,从而让 Trafilatura 的提取算法发挥最大效果。
总结
| 优势 | 说明 |
|---|---|
| F1 分数最高 | 0.92,领先 readability 约 14 个百分点 |
| 元数据全面 | 标题、作者、日期、分类、标签一站式提取 |
| 格式丰富 | 6 种输出格式,适配不同下游需求 |
| 持续维护 | 活跃开发,社区大(数万项目依赖) |
| 可配置 | 支持表格/评论/图片/格式化的精细控制 |
需要企业代理方案?
我们可根据目标站点、并发规模与稳定性目标提供定制方案。