Readability.py¶
本项目是 Mozilla 的 readability 库的 Python 封装。它能从杂乱的网页 HTML 中提取出核心的正文内容,就像浏览器的“阅读模式”一样。
与 readability-python 和 readability-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 的库在这方面已经经过了千锤百炼的优化。
Related Projects¶
- Html2Text: 另一个处理 HTML 的工具,将 HTML 转换为 Markdown。