python markdown2 解析```代码块

当使用 markdown2库无法正确解析被 ``` 包裹的代码块时,通常是因为缺少相应的扩展或配置不正确。以下是解决方案:

问题原因

markdown2默认可能不启用 fenced code blocks(``` 包裹的代码块)支持,或者使用了不兼容的扩展。

解决方案

方法1:使用正确的扩展参数

import markdown2

markdown_text = """
python

def hello():

print("Hello, World!")

"""

使用 fenced-code-blocks 扩展

html = markdown2.markdown(markdown_text, extras=["fenced-code-blocks"])
print(html)

方法2:使用更全面的 extras 配置

html = markdown2.markdown(
    markdown_text,
    extras=[
        "fenced-code-blocks",  # 支持 ``` 代码块
        "code-friendly",       # 更好的代码支持
        "cuddled-lists",       # 更好的列表支持
        "tables",              # 表格支持
        "footnotes",           # 脚注支持
    ]
)

方法3:切换到 python-markdown (markdown)

如果你可以切换库,python-markdown(通常导入为 markdown) 对代码块的支持更好:

import markdown

html = markdown.markdown(
    markdown_text,
    extensions=[
        'fenced_code',    # 支持 ``` 代码块
        'codehilite',     # 代码高亮
        'tables',         # 表格支持
        'toc'            # 目录生成
    ]
)

方法4:自定义解析(如果需要更精细控制)

from markdown2 import Markdown

markdowner = Markdown(
    extras={
        'fenced-code-blocks': {},
        'code-friendly': {},
        'tables': {},
    }
)
html = markdowner.convert(markdown_text)

完整示例

import markdown2

def convert_markdown_to_html(markdown_text):
    """将Markdown转换为HTML,正确处理代码块"""
    extras = [
        "fenced-code-blocks",  # 支持 ``` 代码块
        "code-friendly",      # 更好的代码处理
        "tables",             # 表格支持
        "footnotes",          # 脚注支持
        "toc",                # 目录生成
    ]

    html = markdown2.markdown(
        markdown_text,
        extras=extras,
    )
    return html

测试代码

markdown_text = """

示例Markdown

def hello():
print("Hello, World!")

普通段落文本。 """

html_output = convert_markdown_to_html(markdown_text)
print(html_output)

注意事项

​​代码高亮​​:如果需要语法高亮,还需要安装 Pygments:

pip install pygments ​​HTML输出​​:markdown2默认不转义HTML,如果需要安全输出,可以添加 "safe-mode": True到 extras 字典中。

​​性能考虑​​:对于大量Markdown处理,markdown2通常比 python-markdown更快。

​​扩展兼容性​​:某些扩展可能不兼容,如果遇到问题,可以尝试减少使用的扩展数量。

通过以上方法,你应该能够正确解析包含 ``` 包裹的代码块的Markdown文档。