Python中markdown包的codehilite扩展导致无法显示小于号<和大于号>的解决方法

想用 Python-makrdown 包把 markdown 文件转换成 html 在网页上显示

markdown 中的有部分内容有

    <Post 'learn c'>
    <Post 'learn Py'>
    <Post 'learn Flask'>

转换后生成的 html 中,对应部分变成了

<pre><code>&lt;Post 'learn c'&gt;
&lt;Post 'learn Py'&gt;
&lt;Post 'learn Flask'&gt;
</code></pre>

在网页上这部分内容会正常显示成如下

<Post 'learn c'>
<Post 'learn Py'>
<Post 'learn Flask'>

同样的 markdown 内容,使能 codehilite 扩展后生成的 html 内容变成了

<div class="codehilite"><pre><span></span>&amp;lt;Post &#39;learn c&#39;&amp;gt;
&amp;lt;Post &#39;learn Py&#39;&amp;gt;
&amp;lt;Post &#39;learn Flask&#39;&amp;gt;
</pre></div>

此 html 内容在网页上显示如下

&lt;Post 'learn c'&gt;
&lt;Post 'learn Py'&gt;
&lt;Post 'learn Flask'&gt;

不明白 codehilite 扩展为什么要做这种多余的 escape(),,哪位知道怎么处理??


Python中markdown包的codehilite扩展导致无法显示小于号<和大于号>的解决方法

3 回复

这个问题我遇到过。codehilite扩展默认会把代码块里的<>转义成HTML实体,导致显示不正常。解决方法是在配置里关掉use_pygments选项,或者用markdown.extensions.fenced_code替代。

import markdown

# 方法1:关掉use_pygments
md = markdown.Markdown(extensions=[
    'markdown.extensions.codehilite',
    'markdown.extensions.fenced_code'
], extension_configs={
    'markdown.extensions.codehilite': {
        'use_pygments': False  # 关键在这里
    }
})

# 方法2:只用fenced_code扩展(更简单)
md = markdown.Markdown(extensions=['markdown.extensions.fenced_code'])

text = '''
```python
def test():
    return 1 < 2 and 3 > 0

‘’’

html = md.convert(text) print(html)


两种方法都能让`<`和`>`正常显示。我一般用第二种,因为fenced_code扩展更轻量,而且支持相同的语法高亮功能。

关掉pygments渲染就行了。

有使用 jinja2 之类的话可以尝试过滤器 safe

问题找到了,,原来是新版本引入了 bug,,详情在此: https://github.com/Python-Markdown/markdown/issues/725

修复版本还未发布,,下载老版本试了下没有此问题

回到顶部