在Python 3中从Markdown文件解析元素

7
我该如何在Python 3中从Markdown文件中获取元素列表?我特别想获取Markdown文件中所有图像和链接的列表(以及相关信息,如alt-text和link text)。
这里有一些之前的参考资料(来源),但是它已经快两年没有更新了,所以我认为情况可能有所改变。
如果你设计的解析器支持多重Markdown语法,那就更好了。

@coralv:我已经研究了正则表达式来提取链接,但遇到一个问题,我真的需要一个下推自动机来解决这个问题,以便考虑任意嵌套的括号。大多数情况下,我在构建解析器之前寻找库解决方案。 - Andrew Spott
Markdown本身在过去十年中并没有发生变化,因此我认为链接的问题和答案都是相当更新的。 - Waylan
2个回答

10
如果你想利用两个Python包,即pypandocpanflute,那么你可以使用几行代码以Python的方式完成它(示例代码):
假设有一个文本文件example.md,并且假设你已经安装了Python 3.3+并执行了pip install pypandoc panflute,然后将示例代码放置在同一文件夹中并从shell或例如IDLE中运行它。
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. 然后您可以打印出 URL、alt 文本等。

“AST”是什么意思? - botenvouwer
1
AST是抽象语法树。这是Pandoc文档的内部表示形式。它可以导出为JSON,然后由panflute读取以创建代表文档的Python对象。 - Sergio Correia

3
您可以使用Python-Markdown将Markdown转换为HTML,然后使用Beautiful Soup从HTML文档中提取所需内容,这使得提取图像和链接非常简单。
这个过程可能看起来很复杂,但它肯定比例如使用正则表达式编写临时的Markdown解析器更容易和更健壮。这些模块经过了实战测试,并且效率高。

1
Python-Markdown 在内部使用 ElementTree,并具有广泛的扩展 API。您可以尝试中断解析器并循环遍历 ElementTree 以提取元素并跳过一些步骤。但这将弯曲事物的方式,而不是真正意图,因此解析 HTML 输出可能会给出更可靠的结果。 - Waylan
Python-Markdown还有大量的扩展(包括官方支持的扩展第三方扩展),因此您应该能够获得MultiMarkdown的大部分功能,如果您真的关心缺少的某个功能,您可以编写自己的扩展 - Waylan

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