使用 Python 从 Markdown 中提取 URL 和锚文本

And*_*ndy 6 python regex markdown

我正在尝试从 Markdown 中提取锚文本和关联的 URL。我见过这个问题。不幸的是,答案似乎并没有完全回答我想要的。

在 Markdown 中,插入链接有两种方式:

示例 1:

[anchor text](http://my.url)
Run Code Online (Sandbox Code Playgroud)

示例 2:

[anchor text][2]

   [1]: http://my.url
Run Code Online (Sandbox Code Playgroud)

我的脚本看起来像这样(请注意,我使用的是regex,而不是 re):

import regex
body_markdown = "This is an [inline link](http://google.com). This is a [non inline link][4]\r\n\r\n  [1]: http://yahoo.com"

rex = """(?|(?<txt>(?<url>(?:ht|f)tps?://\S+(?<=\P{P})))|\(([^)]+)\)\[(\g<url>)\])"""
pattern = regex.compile(rex)
matches = regex.findall(pattern, body_markdown, overlapped=True)
for m in matches:
    print m
Run Code Online (Sandbox Code Playgroud)

这会产生输出:

('http://google.com', 'http://google.com')
('http://yahoo.com', 'http://yahoo.com')
Run Code Online (Sandbox Code Playgroud)

我的预期输出是:

('inline link', 'http://google.com')
('non inline link', 'http://yahoo.com')
Run Code Online (Sandbox Code Playgroud)

如何从 Markdown 正确捕获锚文本?

lar*_*sks 9

如何从 Markdown 正确捕获锚文本?

将其解析为结构化格式(例如 html),然后使用适当的工具提取链接标签和地址。

import markdown
from lxml import etree

body_markdown = "This is an [inline link](http://google.com). This is a [non inline link][1]\r\n\r\n  [1]: http://yahoo.com"

doc = etree.fromstring(markdown.markdown(body_markdown))
for link in doc.xpath('//a'):
  print link.text, link.get('href')
Run Code Online (Sandbox Code Playgroud)

这让我:

inline link http://google.com
non inline link http://yahoo.com
Run Code Online (Sandbox Code Playgroud)

另一种选择是编写自己的 Markdown 解析器,这似乎是集中精力的错误地方。