我想解析然后遍历Markdown文件。我正在寻找像xml.etree.ElementTree这样的东西,但是对于Markdown。
一种选择是转换为HTML,然后使用另一个库来解析HTML。但是我想避免这一步。
感谢。
答案 0 :(得分:11)
正如另一条评论提到的那样,Python-Markdown有一个extension API,它碰巧使用了xml.etree.ElementTree。理论上,您可以创建一个扩展来访问该内部ElementTree对象并使用它执行您想要的操作。但是,如果您使用原始HTML(包括HTML实体)和/或codehilite扩展,您将获得一个不完整的文档,因为有一些后处理器在序列化字符串上运行。所以我不会为了你的预期目的而重新开始它(完全披露:我是Python-Markdown的开发者)。
如果Markdown实现存在here,则列表相当冗长。在该列表中的纯Python实现中,Mistune是我所知道的唯一一个使用两步过程的步骤(第一步返回一个解析树,第二步序列化解析树 - 你只需要第一步)。我从来没有亲自使用Mistune,也不能说它的稳定性或准确性,但它应该是非常好的JavaScript库Marked的Python克隆。
如果你四处搜索,我相信一些C实现使用类似的模式。其中一些甚至可能已经有一个Python包装器。如果没有,使用ctypes创建包装器应该不会太难。
如果由于某种原因你想使用一个没有给你完整解析树的实现,那么我建议使用LXML(C lib的python包装器)或{{3来解析生成的HTML。 (纯python),它们都可以返回一个ElementTree对象并且速度更快(尤其是LXML)并且对无效HTML更加宽容(尤其是html5lib,它更像现实世界中的真实浏览器)。请记住,Markdown可以包含原始HTML,并且大多数Markdown解析器只是简单地传递它,有效或无效。如果您尝试使用基于XML的解析器(如xml.etree)或严格的HTML解析器(如标准库中的html.parser)解析它,则单个无效标记可能会使HTML解析器崩溃。
答案 1 :(得分:2)
有Markdown解析模块,但与XML和HTML处理模块不同,它们往往嵌入Markdown渲染包中,而不是用于任意Markdown解析工作。
所以选择一个是查看Python中的Markdown处理器,其中there are a ton找到你最喜欢的解析器,并采用它。
根据您想要完成的任务,可能更容易找到已经可扩展的Markdown处理模块,并构建处理扩展。例如,Python-Markdown有an complete extension mechanism。