【问题标题】:Parsing elements from a markdown file in python 3在python 3中解析markdown文件中的元素
【发布时间】:2016-12-03 07:29:15
【问题描述】:

如何在 python 3 中从 markdown 文件中获取元素列表?我对从 Markdown 文件中获取所有图像和链接的列表(以及相关信息,如替代文本和链接文本)特别感兴趣。

this 是这方面的一些现有技术,但此时它几乎正好有 2 年的历史,我预计情况会有所改变。

如果您提出的解析器支持多标记,则加分。

【问题讨论】:

  • @coralv :我已经研究了正则表达式来提取链接,但遇到了一个问题,我真的需要一个下推自动机来解决任意嵌套的括号。在构建解析器之前,我主要是在寻找库解决方案。
  • Markdown 本身十多年来没有改变,所以我想说链接的问题和答案是最新的。

标签: python markdown multimarkdown


【解决方案1】:

如果你利用两个 Python 包,pypandocpanflute,你可以在几行代码中完成它(sample code):

给定一个文本文件example.md,并假设您有 Python 3.3+ 并且已经使用了pip install pypandoc panflute,然后将示例代码放在同一个文件夹中并从 shell 或从例如运行它。空闲。

import io
import pypandoc
import panflute

def action(elem, doc):
    if isinstance(elem, panflute.Image):
        doc.images.append(elem)
    elif isinstance(elem, panflute.Link):
        doc.links.append(elem)

if __name__ == '__main__':
    data = pypandoc.convert_file('example.md', 'json')
    doc = panflute.load(io.StringIO(data))
    doc.images = []
    doc.links = []
    doc = panflute.run_filter(action, prepare=prepare, doc=doc)

    print("\nList of image URLs:")
    for image in doc.images:
        print(image.url)

步骤如下:

  1. 使用pypandoc获取包含markdown文档AST的json字符串
  2. 将其加载到 panflute 以创建 Doc 对象(panflute 需要流,因此我们使用 StringIO)
  3. 使用 run_filter 函数迭代每个元素,并提取 Image 和 Link 对象。
  4. 然后您可以打印网址、替代文本等。

【讨论】:

    【解决方案2】:

    您可以使用Python-Markdown 将markdown 转换为html,然后使用Beautiful Soup 从html 文档中提取您想要的内容,这使得提取图像和链接非常简单。

    这可能看起来像一个复杂的管道,但它肯定比使用正则表达式编写一个 ad hoc markdown 解析器更容易和更健壮。这些模块经过实战考验且高效。

    【讨论】:

    • Python-Markdown 在内部使用 ElementTree 并具有广泛的扩展 API。您可以中断解析器并循环遍历 ElementTree 以提取元素并跳过几个步骤。但这会以它们并非真正想要的方式扭曲事物,因此解析 HTML 输出可能会得到更可靠的结果。
    • Python-Markdown 也有大量可用的扩展(includedthird-party),因此您应该能够获得 MultiMarkdown 的大部分(如果不是全部)功能。如果缺少您真正关心的功能,您可以write your own extension
    猜你喜欢
    • 2015-02-05
    • 2013-06-04
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多