我想解析并遍历Markdown文件。我正在寻找类似xml.etree.ElementTree的东西,但用于Markdown。
一个选择是将其转换为HTML,然后使用另一个库来解析HTML。但我想避免这一步骤。
谢谢。
我想解析并遍历Markdown文件。我正在寻找类似xml.etree.ElementTree的东西,但用于Markdown。
一个选择是将其转换为HTML,然后使用另一个库来解析HTML。但我想避免这一步骤。
谢谢。
正如另一个评论所提到的那样,Python-Markdown有一个扩展 API,并且它恰好在底层使用xml.etree.ElementTree。你理论上可以创建一个扩展来访问该内部ElementTree对象,并对其进行操作。但是,如果您使用原始HTML(包括HTML实体)和/或codehilite扩展,则会得到不完整的文档,因为有一些后处理器会运行在序列化字符串上。因此,我不会真正推荐它用于您的预期目的(充分披露:我是Python-Markdown的开发人员)。
Markdown实现的相当长的列表在这里。在该列表中纯Python实现中,Mistune是我知道的唯一一个使用两步过程(第一步返回解析树,第二步序列化解析树--您只需要第一步)的实现。我从未亲自使用过Mistune,无法对其稳定性或准确性发表意见,但据说它是非常好的JavaScript库Marked的Python克隆版。
***编辑***
一些新的Python包已经推出,它们都使用解析器/渲染器模式和/或解析树/标记流程来不同程度地解析Markdown。我没有任何与它们的个人经验,但它们可能对这个目的有用。请参见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 解析器崩溃。
mistune
绝对可以通过https://mistune.lepture.com/en/latest/guide.html#ast提供类似AST的产品。`mistune.create_markdown(renderer='ast')` - David