跳转至

Readability.py

Repo   ·   PyPI   ·   Upstream   ·   Upstream²

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

readability-pythonreadability-lxml 这种 “python port” 相反,本项目是一个 “python wrapper”。我没有写任何逻辑代码,而是通过 JavaScript 引擎运行原本的 typescript 代码。从而确保这个项目的维护与上游一致。

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

Features

  • 100% Fidelity: 直接运行原版 JavaScript 代码,保证提取结果与 Firefox 阅读模式完全一致。
  • Cross Runtime: 既支持标准的 CPython 环境,也支持 Pyodide(浏览器/WASM)环境。
  • Easy to Use: 简单的 Python API,开箱即用。

Implementation

这是一个典型的 Polyglot 项目。

  • CPython 环境下,它使用 pythonmonkey(一个嵌入了 SpiderMonkey JS 引擎的 Python 库)来执行 @mozilla/readability 的 JS 代码。
  • Pyodide 环境下,它直接利用浏览器原生的 JavaScript 引擎。

My Clever Bits (我的巧思)

我没有选择用 Python 重写 Readability 的逻辑(那样维护成本极高且很难保证一致性),而是选择了 "Run JS in Python" 的方案。

通过检测 sys.platform == 'emscripten',代码会自动切换后端。这意味着同一个包,在服务器上跑时调用的是嵌入式 JS 引擎,在浏览器里跑时(通过 Pyodide)调用的是原生 JS 引擎。这种无缝的跨环境支持是我最得意的地方。

Deep Insight (深入洞见)

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

src/readability/__init__.py 中,我编写了一个适配层。它负责将 Python 的字符串(HTML)传递给 JavaScript 环境,执行 new Readability(doc).parse(),然后将返回的 JS 对象转换回 Python 字典。

这种方法不仅解决了逻辑复用的问题,还避开了 Python 在处理极其糟糕的 HTML 时可能遇到的性能瓶颈,因为 Mozilla 的库在这方面已经经过了千锤百炼的优化。

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