【问题标题】:Parse and traverse elements from a Markdown file解析和遍历 Markdown 文件中的元素
【发布时间】:2015-02-05 15:12:38
【问题描述】:

我想解析然后遍历一个 Markdown 文件。我正在寻找类似 @​​987654321@ 的东西,但要寻找 Markdown。

一种选择是转换为 HTML,然后使用另一个库来解析 HTML。但我想避免这一步。

谢谢。

【问题讨论】:

    标签: python parsing python-2.7 markdown


    【解决方案1】:

    正如另一条评论所提到的,Python-Markdown 有一个 extension API 并且它恰好在引擎盖下使用了 xml.etree.ElementTree。理论上,您可以创建一个扩展来访问该内部 ElementTree 对象并使用它做您想做的事情。但是,如果您使用原始 HTML(包括 HTML 实体)和/或 codehilite 扩展,您将获得不完整的文档,因为有一些后处理器在序列化字符串上运行。因此,我不会出于您的预期目的重新开始使用它(完全披露:我是 Python-Markdown 的开发人员)。

    如果存在 Markdown 实现,则列表相当长 here。在该列表中的纯 Python 实现中,Mistune 是我所知道的唯一一个使用两步过程(第一步返回解析树,第二步序列化解析树——您只需要第一步)。我从未亲自使用过 Mistune,无法评价它的稳定性或准确性,但它应该是非常好的 JavaScript 库 Marked 的 Python 克隆。

    *** 编辑 ***

    一些较新的 Python 包已经可用,它们都在不同程度上使用解析器/渲染器模式和/或解析树/令牌流。我对它们中的任何一个都没有任何个人经验,但它们可能对此有用。请参阅mistletoemarkdown-it-pymarko

    *** 结束编辑 ***

    如果您四处搜索,我相信一些 C 实现使用类似的模式。其中一些甚至可能已经有了 Python 包装器。如果没有,使用ctypes 创建包装器应该不会太难。

    如果出于某种原因您想使用一个不提供完整解析树的实现,那么我建议使用 LXML(C 库的 Python 包装器)或 html5lib(纯python),它们都可以返回一个 ElementTree 对象,并且速度更快(尤其是 LXML),并且对无效 HTML 的容忍度更高(尤其是 html5lib,它的行为更像现实世界中的真实浏览器)。请记住,Markdown 可以包含原始 HTML,大多数 Markdown 解析器只是简单地通过它,无论是否有效。如果您随后尝试使用基于 XML 的解析器(如在 xml.etree 中)或严格的 HTML 解析器(如标准库中的 html.parser)对其进行解析,则单个无效标记可能会使 HTML 解析器崩溃。

    【讨论】:

    • @Waylan - 如何在 Python-Markdown 中访问内部元素树?谢谢!
    • @jim70 你只能通过扩展来做到这一点。特别来自treprocessor
    • 感谢您的回复!有没有我可以尝试学习和学习使用 Markdown ElementTree 提取元素树的部分以添加到另一个 Markdown 文件的示例?我尝试过但未能为自己解决。 :(
    • @jim70 扩展 API 不打算以这种方式使用。相反,它旨在更改文档。我希望您使用生成令牌流或语法树的解析器会取得更大的成功。请参阅我在上面的答案的编辑中链接到的较新的库。
    • 感谢您添加到答案中的编辑。将尝试浏览这些包,看看我是否可以破译如何从这些库的工作方式中提取令牌流/语法树。 @Waylan
    【解决方案2】:

    有 Markdown 解析模块,但与 XML 和 HTML 处理模块不同,它们倾向于嵌入在 Markdown 渲染包中,而不是呈现给任意 Markdown 解析工作。

    所以选项一是研究 Python 中的 Markdown 处理器,其中there are a ton,找到你最喜欢的解析器,然后采用它。

    但是,根据您想要完成的任务,找到一个已经可扩展的 Markdown 处理模块并构建一个处理扩展可能会更容易。例如,Python-Markdown 有 an complete extension mechanism

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 2013-06-04
      • 2012-12-03
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多