用 markdown 库最直接,不依赖系统环境,纯 python 实现,但默认不渲染表格、代码高亮等扩展功能;需显式传入 extensions=['tables', 'fenced_code'] 启用表格和代码块,加 'codehilite' 并安装 pygments 实现语法高亮,中文锚点失效可配 toc 扩展与自定义 slugify 函数。

用 markdown 库最直接,不依赖系统环境,纯 Python 实现,但需注意默认不渲染表格、代码高亮等扩展功能。
为什么不用 pandoc 命令行?
虽然 pandoc 功能强、输出质量高,但要求系统预装且路径可访问,跨平台部署时容易卡在 FileNotFoundError: [Errno 2] No such file or directory: 'pandoc'。如果只是做基础转换(标题、列表、段落),markdown 库更轻量、更可控。
- 确认已安装:
pip install markdown - 它默认只启用标准 CommonMark 子集,不支持
tables、fenced_code等扩展,需显式开启 - 不处理图片路径重写、CSS 注入、模板套用——这些得自己补逻辑
如何启用表格和代码块渲染?
Markdown 原生语法如 | A | B | 和 ```python 在默认 markdown.markdown() 下会被忽略为纯文本。必须传入 extensions 参数:
输入文章 URL,返回干净 Markdown。支持17个平台(头条、微信公众号、知乎、36kr、虎嗅、华尔街见闻、澎湃、InfoQ 等)专项优化,双引擎提取、图片本地化、三层抓取策略。常与 browser‑web‑search skill配合:先用 bws 搜索获取 url 列表,再逐篇调用本 skill 提取正文。
import markdown html = markdown.markdown(md_text, extensions=['tables', 'fenced_code'])
-
tables:解析竖线表格(需确保 Markdown 表格语法规范,首行末尾不能多空格) -
fenced_code:识别```lang块,但仅生成<pre class="brush:php;toolbar:false;"><code></code>,不带语法高亮</pre> - 若要高亮,加
codehilite扩展:extensions=['fenced_code', 'codehilite'],并确保安装pygments
批量转换时怎么保留原始文件结构?
别用 os.listdir() 简单遍历——它不递归,也不过滤非 .md 文件。推荐 pathlib + glob:
from pathlib import Path
md_files = list(Path("docs").rglob("*.md")) # 递归找所有 .md
for md_path in md_files:
html_path = md_path.with_suffix(".html")
with open(md_path, encoding="utf-8") as f:
html = markdown.markdown(f.read(), extensions=["tables", "fenced_code"])
with open(html_path, "w", encoding="utf-8") as f:
f.write(f"\n{html}")
-
rglob自动处理子目录,比os.walk更简洁 -
with_suffix(".html")安全替换后缀,不会误改README.md.bak这类文件 - 注意编码:Windows 上常见
UnicodeDecodeError,强制用encoding="utf-8"
中文标题锚点失效怎么办?
默认 markdown 生成的 <h2 id="xxx"></h2> 中文 ID 会变成 id="%E4%B8%AD%E6%96%87",浏览器能跳转,但部分静态站点生成器或 TOC 插件不认 URL 编码 ID。解决方法是加 toc 扩展并配置:
markdown.markdown(md_text, extensions=[
'tables', 'fenced_code',
'toc' # 启用目录生成
], extension_configs={
"toc": {"slugify": lambda x, **y: x.replace(" ", "-")} # 简单去空格,不编码中文
})
-
toc扩展自带slugify函数,默认用markdown.extensions.toc.make_anchor_id,会编码中文 - 自定义
slugify是最简方案;若需真正语义化 ID(如 “安装步骤” → “an-zhuang-bu-zhou”),得引入python-slugify - 这个配置只影响
<h></h>标签的id,不影响正文内容
真正麻烦的是 CSS 样式和资源路径——HTML 里相对路径如  在转换后仍指向原位置,但 HTML 可能放在不同目录。这部分没银弹,得按实际部署结构手动调整 base_url 或用正则替换路径。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










