精准提取:正文、元数据与表格——Trafilatura 提取能力详解

Trafilatura 的核心提取算法、可提取字段、与主流提取库的 benchmark 对比,以及如何获取最佳提取结果。

亿牛云技术团队2026年4月25日3 分钟阅读

Trafilatura 的提取引擎

Trafilatura 的正文提取结合了三种策略:

  1. 基于 HTML 结构的算法——分析 DOM 树中的文本密度、标点符号比例、链接文本比例,找到最可能的"正文区域"
  2. jusText 算法——启发式文本分类,将 HTML 块分为"正文"、"噪声"、"标题"等类别
  3. 回退到 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
表格tablesHTML <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 分数精确率召回率维护状态
Trafilatura0.920.940.90活跃
readability-lxml0.780.820.75
newspaper3k0.710.680.75停滞
boilerpy30.750.800.71
jusText0.730.700.77

数据来源:ScrapingHub article-extraction-benchmark,Bevendorff et al. 2023 实证研究,Lejeune & Barbaresi 2020 评估。

为什么 Trafilatura 领先

  1. 多策略融合:单一算法在某个站点失效时,其他算法兜底
  2. 持续维护:2021 年发布以来一直有更新,适配现代 HTML 结构
  3. 元数据提取:其他库大多只提取正文,Trafilatura 同时提取 6+ 项元数据
  4. 格式支持:输出格式最丰富(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 种输出格式,适配不同下游需求
持续维护活跃开发,社区大(数万项目依赖)
可配置支持表格/评论/图片/格式化的精细控制

需要企业代理方案?

我们可根据目标站点、并发规模与稳定性目标提供定制方案。