从Markdown文件中解析和遍历元素

jpe*_*thy 14 python markdown parsing python-2.7

我想解析然后遍历Markdown文件.我正在寻找像xml.etree.ElementTree这样的东西,但是对于Markdown.

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

谢谢.

Way*_*lan 14

正如另一篇评论所提到的,Python-Markdown有一个扩展API,它碰巧使用了xml.etree.ElementTree.理论上,您可以创建一个扩展来访问该内部ElementTree对象并使用它执行您想要的操作.但是,如果您使用原始HTML(包括HTML实体)和/或codehilite扩展,您将获得一个不完整的文档,因为有一些后处理器在序列化字符串上运行.所以我不会为了你的预期目的而重新开始它(完全披露:我是Python-Markdown的开发者).

如果此处存在Markdown实现,则是一个相当冗长的列表.在该列表中的纯Python实现中,Mistune是我所知道的唯一一个使用两步过程的步骤(第一步返回一个解析树,第二步序列化解析树 - 你只需要第一步).我从来没有亲自使用Mistune,也不能说它的稳定性或准确性,但它应该是一个非常好的JavaScript库标记的Python克隆.

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

如果由于某种原因,你想用,不给你一个完整的解析树的实现,那么我会建议解析使用生成的HTML LXML(该C 11b的Python包装)或html5lib(纯Python),两者都可以的返回一个ElementTree对象,速度更快(尤其是LXML),并且对无效HTML更加宽容(尤其是html5lib,它更像现实世界中的真实浏览器).请记住,Markdown可以包含原始HTML,并且大多数Markdown解析器只是简单地传递它,有效或无效.如果您尝试使用基于XML的解析器(如xml.etree)或严格的HTML解析器(如标准库中的html.parser)解析它,则单个无效标记可能会使HTML解析器崩溃.


Jon*_*ice 5

有 Markdown 解析模块,但与 XML 和 HTML 处理模块不同,它们往往嵌入到 Markdown 渲染包中,而不是呈现出来用于任意 Markdown 解析工作。

因此,第一个选择是研究 Python 中的 Markdown 处理器(其中有很多),找到您最喜欢的解析器,然后采用它。

然而,根据您想要完成的任务,找到已经可扩展的 Markdown 处理模块并构建处理扩展可能会更容易。例如,Python-Markdown具有完整的扩展机制