【发布时间】:2015-02-05 15:12:38
【问题描述】:
我想解析然后遍历一个 Markdown 文件。我正在寻找类似 @987654321@ 的东西,但要寻找 Markdown。
一种选择是转换为 HTML,然后使用另一个库来解析 HTML。但我想避免这一步。
谢谢。
【问题讨论】:
标签: python parsing python-2.7 markdown
我想解析然后遍历一个 Markdown 文件。我正在寻找类似 @987654321@ 的东西,但要寻找 Markdown。
一种选择是转换为 HTML,然后使用另一个库来解析 HTML。但我想避免这一步。
谢谢。
【问题讨论】:
标签: python parsing python-2.7 markdown
正如另一条评论所提到的,Python-Markdown 有一个 extension API 并且它恰好在引擎盖下使用了 xml.etree.ElementTree。理论上,您可以创建一个扩展来访问该内部 ElementTree 对象并使用它做您想做的事情。但是,如果您使用原始 HTML(包括 HTML 实体)和/或 codehilite 扩展,您将获得不完整的文档,因为有一些后处理器在序列化字符串上运行。因此,我不会出于您的预期目的重新开始使用它(完全披露:我是 Python-Markdown 的开发人员)。
如果存在 Markdown 实现,则列表相当长 here。在该列表中的纯 Python 实现中,Mistune 是我所知道的唯一一个使用两步过程(第一步返回解析树,第二步序列化解析树——您只需要第一步)。我从未亲自使用过 Mistune,无法评价它的稳定性或准确性,但它应该是非常好的 JavaScript 库 Marked 的 Python 克隆。
*** 编辑 ***
一些较新的 Python 包已经可用,它们都在不同程度上使用解析器/渲染器模式和/或解析树/令牌流。我对它们中的任何一个都没有任何个人经验,但它们可能对此有用。请参阅mistletoe、markdown-it-py 和 marko。
*** 结束编辑 ***
如果您四处搜索,我相信一些 C 实现使用类似的模式。其中一些甚至可能已经有了 Python 包装器。如果没有,使用ctypes 创建包装器应该不会太难。
如果出于某种原因您想使用一个不提供完整解析树的实现,那么我建议使用 LXML(C 库的 Python 包装器)或 html5lib(纯python),它们都可以返回一个 ElementTree 对象,并且速度更快(尤其是 LXML),并且对无效 HTML 的容忍度更高(尤其是 html5lib,它的行为更像现实世界中的真实浏览器)。请记住,Markdown 可以包含原始 HTML,大多数 Markdown 解析器只是简单地通过它,无论是否有效。如果您随后尝试使用基于 XML 的解析器(如在 xml.etree 中)或严格的 HTML 解析器(如标准库中的 html.parser)对其进行解析,则单个无效标记可能会使 HTML 解析器崩溃。
【讨论】:
有 Markdown 解析模块,但与 XML 和 HTML 处理模块不同,它们倾向于嵌入在 Markdown 渲染包中,而不是呈现给任意 Markdown 解析工作。
所以选项一是研究 Python 中的 Markdown 处理器,其中there are a ton,找到你最喜欢的解析器,然后采用它。
但是,根据您想要完成的任务,找到一个已经可扩展的 Markdown 处理模块并构建一个处理扩展可能会更容易。例如,Python-Markdown 有 an complete extension mechanism。
【讨论】: