python - 从 Markdown 中解析元素

标签 python parsing markdown

我想解析 markdown 文件中的特定元素(例如链接)并从这些元素中获取值,但我无法找到使用 python-markdown 包的方法。 是否可以使用所述包来完成此操作,或者我应该将 .md 渲染为 html,然后使用一些工具(例如 beautiful-soup)来解析 html 以获取元素和/或结构?

最佳答案

python3 选项是 ReParser

pip install ReParser

其文档中的示例(粘贴在末尾)将输出:

[('Hello ', {}),
 ('bold', {'is_bold': True}),
 (' world!', {}),
 ('\n', {'segment_type': 'LINE_BREAK'}),
 ('You can ', {}),
 ('try ', {'is_bold': True}),
 ('this', {'is_bold': True, 'is_italic': True}),
 (' awesome', {'is_bold': True}),
 (' ', {}),
 ('link', {'link_target': 'http://www.eff.org'}),
 ('.', {})]

示例代码是:

import re
from pprint import pprint
from reparser import Parser, Token, MatchGroup

boundary_chars = r'\s`!()\[\]{{}};:\'".,<>?«»“”‘’*_~='
b_left = r'(?:(?<=[' + boundary_chars + r'])|(?<=^))'  # Lookbehind
b_right = r'(?:(?=[' + boundary_chars + r'])|(?=$))'   # Lookahead

markdown_start = b_left + r'(?<!\\){tag}(?!\s)(?!{tag})'
markdown_end = r'(?<!{tag})(?<!\s)(?<!\\){tag}' + b_right
markdown_link = r'(?<!\\)\[(?P<link>.+?)\]\((?P<url>.+?)\)'
newline = r'\n|\r\n'

url_proto_regex = re.compile(r'(?i)^[a-z][\w-]+:/{1,3}')

def markdown(tag):
    """Return sequence of start and end regex patterns for simple Markdown tag"""
    return (markdown_start.format(tag=tag), markdown_end.format(tag=tag))

def url_complete(url):
    """If URL doesn't start with protocol, prepend it with http://"""
    return url if url_proto_regex.search(url) else 'http://' + url

tokens = [
    Token('bi1',  *markdown(r'\*\*\*'), is_bold=True, is_italic=True),
    Token('bi2',  *markdown(r'___'),    is_bold=True, is_italic=True),
    Token('b1',   *markdown(r'\*\*'),   is_bold=True),
    Token('b2',   *markdown(r'__'),     is_bold=True),
    Token('i1',   *markdown(r'\*'),     is_italic=True),
    Token('i2',   *markdown(r'_'),      is_italic=True),
    Token('pre3', *markdown(r'```'),    skip=True),
    Token('pre2', *markdown(r'``'),     skip=True),
    Token('pre1', *markdown(r'`'),      skip=True),
    Token('s',    *markdown(r'~~'),     is_strikethrough=True),
    Token('u',    *markdown(r'=='),     is_underline=True),
    Token('link', markdown_link, text=MatchGroup('link'),
          link_target=MatchGroup('url', func=url_complete)),
    Token('br', newline, text='\n', segment_type="LINE_BREAK")
]

parser = Parser(tokens)
text = ('Hello **bold** world!\n'
        'You can **try *this* awesome** [link](www.eff.org).')

segments = parser.parse(text)
pprint([(segment.text, segment.params) for segment in segments])

关于python - 从 Markdown 中解析元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992155/

相关文章:

python - 如何在 TRAC simplemultiproject 环境中按权限仅显示可用项目

python - 在列之间添加空间

c# - 使用循环填充二维数组

javascript - 在Jison中调试

Python & Tkinter -> 关于调用卡住程序的长时间运行的函数

node.js - 在 Wintersmith 中访问额外的 Markdown 元数据参数

javascript - 更改路线后 React Markdown 代码突出显示不起作用

python - BeautifulSoup 和 lxml 找不到 div 元素

markdown - 使用 Markdown 和 pandoc 将 HTML 中的文本/图片居中

python gzip : OverflowError size does not fit in an int