跳转至

Readability.py

Repo   ·   PyPI   ·   Upstream   ·   Upstream²

本项目是 Mozillareadability 库的 Python 封装。它能从杂乱的网页 HTML 中提取出核心的正文内容,就像浏览器的“阅读模式”一样。

readability-pythonreadability-lxml 这种 “python port” 相反,本项目更接近一个 “python wrapper”:它把 Python API 包在 JavaScript 实现外层,而不是在 Python 里重写整套提取逻辑。

以下内容基本上是 AI 生成的,我还没校对,可能质量不高

Features

  • High Fidelity: 直接调用 JavaScript 实现,尽量跟随上游 @mozilla/readability 的行为。
  • Cross Runtime: 既支持标准的 CPython 环境,也支持 Pyodide(浏览器/WASM)环境。
  • Easy to Use: 简单的 Python API,开箱即用。

Implementation

这是一个典型的 Polyglot 项目。

  • CPython 环境下,当前实现会按 stpyv8 -> mini-racer -> pythonmonkey -> node_subprocess 的顺序尝试 JavaScript 执行后端;README 里仍主要用 pythonmonkey 举例说明。
  • Pyodide 环境下,它会切换到 pyodide 后端,复用浏览器侧的 JavaScript 运行环境。

My Clever Bits (我的巧思)

我没有选择用 Python 重写 Readability 的逻辑,而是选择了 "Run JS in Python" 的方案。

代码会先通过 sys.platform == 'emscripten' 区分 Pyodide 环境;非 emscripten 时,再按多个 JS 后端的可用性顺序回退。这使同一套 Python API 能复用到浏览器和常规 Python 环境。

Deep Insight (深入洞见)

这个项目展示了 Language Interoperability 的强大威力。

适配层并不只在 src/readability/__init__.py__init__.py 更多是 API 导出,真正的包装逻辑分布在 api/parse.pyimpl/* 里。整体思路仍然是把 Python 的 HTML 字符串和选项传给 JavaScript 侧实现,再把返回结果映射成 Python 的 Article dataclass。

这种设计把上游行为复用和 Python API 暴露拆开了,维护重点更多落在适配层,而不是重写解析算法。

  • Html2Text: 另一个处理 HTML 的工具,将 HTML 转换为 Markdown。