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

32

我想解析并遍历Markdown文件。我正在寻找类似xml.etree.ElementTree的东西,但用于Markdown。

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

谢谢。

2个回答

27

正如另一个评论所提到的那样,Python-Markdown有一个扩展 API,并且它恰好在底层使用xml.etree.ElementTree。你理论上可以创建一个扩展来访问该内部ElementTree对象,并对其进行操作。但是,如果您使用原始HTML(包括HTML实体)和/或codehilite扩展,则会得到不完整的文档,因为有一些后处理器会运行在序列化字符串上。因此,我不会真正推荐它用于您的预期目的(充分披露:我是Python-Markdown的开发人员)。

Markdown实现的相当长的列表在这里。在该列表中纯Python实现中,Mistune是我知道的唯一一个使用两步过程(第一步返回解析树,第二步序列化解析树--您只需要第一步)的实现。我从未亲自使用过Mistune,无法对其稳定性或准确性发表意见,但据说它是非常好的JavaScript库Marked的Python克隆版。

***编辑***

一些新的Python包已经推出,它们都使用解析器/渲染器模式和/或解析树/标记流程来不同程度地解析Markdown。我没有任何与它们的个人经验,但它们可能对这个目的有用。请参见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中访问内部ElementTree?谢谢! - jim70
@jim70 你只能通过扩展实现这个功能,具体来说是通过 treeprocessor 实现。 - Waylan
谢谢您的回复!有没有任何示例我可以尝试、学习和了解,有人使用Markdown ElementTree来提取元素树的部分内容并添加到另一个Markdown文件中?我尝试过但未能自己解决。 :( - jim70
1
@jim70,扩展API并不是用来那样使用的。相反,它旨在改变文档。我认为你使用生成令牌流或语法树的解析器会更成功。请参见我在上面回答中链接到的更新库。 - Waylan
感谢您对答案所做的修改。我会尝试查看这些包,看看能否从这些库的工作方式中解密如何提取令牌流/语法树。@Waylan - jim70

5
有许多Markdown解析模块,但与XML和HTML处理模块不同的是,它们往往嵌入在Markdown呈现包中,而不是为任意Markdown解析工作提供。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接