Python 中的 HTML 转 Markdown:最佳工具与实用技巧

最后更新于 August 19, 2026
Python 中的 HTML 转 Markdown:最佳工具与实用技巧

让我给你讲个故事。几年前,我正卡在一个项目里,得处理成千上万的网页——满眼都是乱糟糟的 HTML、内联样式,还有数不清的 <div>。我的目标是什么?把这些内容整理成干净、好读的格式,放进团队的内部 Wiki 里,而这个 Wiki 和很多现代工具一样,用的都是 Markdown。我得说,一开始我也想走老路:复制、粘贴,然后默默祈祷一切别出岔子。但在喝到第三杯咖啡、修到第五个坏掉的表格之后,我就知道,这事儿肯定还有更好的解法。

HTML to Markdown power.png

后来我发现,遇到这个问题的人不止我一个。无论你是在搭文档、准备给 AI 模型训练的数据,还是单纯想让笔记别再像一锅意大利面,而是像一份清清楚楚的购物清单,把 HTML 转成 Markdown,都是商业用户很值得掌握的一项“超能力”。那 Python 呢?它就像这件事上的瑞士军刀:上手不难、灵活度高,而且有一堆库能把整个过程变得(几乎)有趣。这篇指南里,我会带你看看为什么要做、怎么做,以及在 Python 里做 html to markdown 时那些最容易踩坑的奇怪边角情况,同时也会分享一些实战经验。

什么是 HTML 转 Markdown?

先拆开来说:HTML(超文本标记语言)是网页的底层骨架。它很适合浏览器,但如果你想直接阅读或编辑内容,它就没那么友好了——除非你很享受盯着一屏幕尖括号猜意思。Markdown 就不一样了,它是一种轻量级的纯文本格式语法,读写都很顺手。你不用写 <h1>Title</h1>,直接写 # Title 就行;不用写 <strong>bold</strong>,写 **bold** 就够了。它清楚到连非技术同事也能很快上手编辑。

HTML 转 Markdown,说白了就是把 HTML 标签转换成对应的 Markdown 语法。比如:

<h1>This is a Heading</h1>
<p>This is a paragraph with <strong>bold</strong> and <em>italic</em> text.</p>
<a href="https://example.com">This is a link</a>

会变成:

# This is a Heading

This is a paragraph with **bold** and *italic* text.

[This is a link](https://example.com)

这个过程其实和 Markdown 最初的设计方向是反过来的(Markdown 转 HTML),但它已经成了现代工作流里的刚需,尤其是在 Markdown 越来越受商业团队和技术团队欢迎的今天(Google Developer Docs)。

顺带一提:如果你反过来要把 Markdown 转成 HTML,Python 当然也没问题。不过这部分我们后面再讲。

为什么要把 HTML 转成 Markdown?对业务有什么价值?

那为什么还要费劲把 HTML 转 Markdown 呢?一句话:Markdown 更简洁、更易读,也更好维护。但具体来说,下面这些场景里,这种转换会直接帮你提效:

使用场景为什么要转成 Markdown?
技术文档Markdown 文件是纯文本,非常适合版本控制、协作和快速编辑。再也不用为一堆零散的 <div> 标签引发合并冲突了 (Document360).
笔记与知识库Markdown 就算是原始文本也很好读,能在 Notion、Obsidian 等应用之间自由迁移,不会被某种封闭格式锁死 (Markdown Guide).
内容迁移如果你要把旧版 HTML(老博客、内网页面)迁到现代系统里,Markdown 能让迁移更顺,也方便后续更新 (cantoni.org).
AI 训练数据准备LLM 和 NLP 模型更喜欢干净、结构化的文本。Markdown 能去掉 HTML 的冗余噪音,留下更适合“喂给模型”的内容 (Apify).
内容编辑与协作Markdown 语法对非开发者也很直观——再也不会出现“等等,这个 <span> 到底在哪儿结束?”这种让人头大的瞬间。它更耐用,也能在任何文本编辑器里轻松修改 (Markdown Guide).

顺带说个有意思的点:Markdown 之所以能流行起来,很大原因就是它足够简单,所以它慢慢成了从 README 文件到内部 Wiki 的默认选择之一 (Google Developer Docs)。可以说,它就是那种“写一次,到处用”的格式。

Python 中用于 HTML 转 Markdown 的工具概览

Python 一直是我做这类文本转换任务时的首选语言,而它在 html to markdown 这件事上也已经很成熟了。主力工具大致有这些:

工具 / 库类型优点局限 / 备注
markdownifyPython 库易用、可定制、能保留结构(标题、表格、图片、链接)、可扩展可能会漏掉一些复杂 HTML,通常需要 BeautifulSoup 配合使用
html2textPython 库简单、对格式不规范的 HTML 容错强、输出简洁、可设置很多忽略选项表格可能会被压成普通文本,对高级格式控制较弱
Pandoc独立工具(可配合 Python 包装器使用)能处理复杂 HTML,支持多种 Markdown 风格,适合批量处理需要单独安装,小任务里可能有点“杀鸡用牛刀”
Aspose.HTML for Python via .NET商业 Python/.NET 库企业级能力,支持多种 Markdown 风格,提供高级选项需要付费授权,配置也更重一些

下面我们再展开讲讲。

对比 Python 库:哪个更适合你的需求?

markdownify

  • 适合场景: 大多数业务用户、文档转换,以及希望 Markdown 尽量保留原始 HTML 结构的情况。
  • 优点: API 很简单、可定制性强(比如标题样式、去掉某些标签等)、支持图片、链接和表格处理 (GitHub).
  • 缺点: 如果 HTML 层级特别深,或者结构很奇怪,可能会漏掉部分内容 (Reddit).

html2text

  • 适合场景: 需要快速转换、想从乱七八糟的网页里提取可读文本,并且更看重简洁而不是结构完整的情况。
  • 优点: 对格式不规范的 HTML 兼容性不错,能轻松忽略链接和图片,输出风格也很干净 (GitHub).
  • 缺点: 表格不一定能转成标准 Markdown 表格,对输出样式的控制也比较少。

Pandoc

  • 适合场景: 大规模转换、批处理、复杂文档,或者你需要特定 Markdown 风格的时候。
  • 优点: 基本上什么都能转,支持扩展,表格、脚注、数学公式都能处理 (cantoni.org).
  • 缺点: 需要单独安装,通常通过命令行或 Python 封装来调用。

Aspose.HTML for Python via .NET

  • 适合场景: 企业环境,需要高级功能,或者要和其他 Aspose 产品一起集成。
  • 优点: 支持多种 Markdown 风格,还可以通过保存选项进行定制 (Aspose Docs).
  • 缺点: 需要商业授权,配置流程也更复杂。

我的建议: 对大多数日常需求,先从 markdownify 或 html2text 开始。如果你遇到复杂表格、脚注,或者需要 GitHub Flavored Markdown,那就让 Pandoc 上场。

分步指南:在 Python 中把 HTML 转成 Markdown

接下来进入实操部分。哪怕你不是开发者,也能照着做。下面我会给你两个示例:一个用 markdownify,一个用 html2text。

示例:使用 markdownify 把 HTML 转成 Markdown

先安装库:

pip install markdownify

假设你有下面这段 HTML:

<h2>Example Title</h2>
<p>This is a <strong>bold</strong> word and an <em>italic</em> word.</p>
<p>Visit <a href="http://example.com">our site</a> for more info.</p>

对应的 Python 代码如下:

from markdownify import markdownify as md

html_content = """
<h2>Example Title</h2>
<p>This is a <strong>bold</strong> word and an <em>italic</em> word.</p>
<p>Visit <a href="http://example.com">our site</a> for more info.</p>
"""

markdown_text = md(html_content, heading_style="ATX")
print(markdown_text)

生成的 Markdown:

## Example Title

This is a **bold** word and an *italic* word.

Visit [our site](http://example.com) for more info.
  • 标题会变成 ##,粗体和斜体会被转换,链接会变成 [文本](URL) 的格式。
  • 图片(<img>)会变成 ![alt](url)
  • 表格会被转换成 Markdown 表格(用竖线和横线表示)。

你还可以调整 markdownify 的行为。比如,去掉 <style><script> 标签:

markdown_text = md(html_content, strip=['style', 'script'])

如果需求更高级,你甚至可以继承转换器,自定义某些标签的处理方式 (GitHub Docs).

示例:使用 html2text 把 HTML 转成 Markdown

先安装库:

pip install html2text

下面还是用同样的 HTML:

import html2text

html_content = """
<h2>Example Title</h2>
<p>This is a <b>bold</b> word and an <i>italic</i> word.</p>
<p>Visit <a href="http://example.com">our site</a> for more info.</p>
"""

converter = html2text.HTML2Text()
converter.ignore_links = False  # 保留链接
markdown_text = converter.handle(html_content)
print(markdown_text)

生成的 Markdown:

## Example Title

This is **bold** word and an *italic* word.

Visit [our site](http://example.com) for more info.
  • 默认情况下,html2text 会按 78 个字符自动换行(如果你不想换行,可以设置 converter.body_width = 0)。
  • 你可以忽略图片(converter.ignore_images = True),或者把链接输出成引用式。
  • 表格不一定会被格式化成 Markdown 表格——如果表格对你很重要,一定要先测试。

进阶选项:自定义 HTML 转 Markdown 的转换过程

有时候,你需要的不只是“直接转换”。比如你想排除某些 HTML 标签、处理内联样式,或者输出某种特定 Markdown 风格,比如 GitHub Flavored Markdown。

排除或转换特定 HTML 元素

  • markdownify: 可以用 strip 参数移除标签,或者继承转换器来做自定义处理 (GitHub).
  • html2text: 使用忽略开关(ignore_linksignore_images)。如果想做更复杂的筛选,可以先用 BeautifulSoup 预处理 HTML。
  • Pandoc: 通过命令行参数或过滤器来控制转换过程。
  • Aspose: 通过保存选项选择 Markdown 风格 (Aspose Docs).

处理内联样式和脚本

  • 大多数转换器都会丢掉 <style><script> 标签,因为 Markdown 本身不支持这些内容 (Aspose Docs).
  • 如果你要保留代码片段,记得让它们包在 <pre><code> 标签里;这样转换器通常会把它们转成 Markdown 代码块。

选择 Markdown 风格

  • Pandoc: 可以指定输出风格,比如 -to=gfm 表示 GitHub 风格,-to=commonmark 等。
  • Aspose: 使用 MarkdownSaveOptions 来选择风格。
  • markdownify: 没有明确的风格切换,但你可以通过微调输出,让它更贴近你的需求。

处理边缘情况

  • 嵌入媒体: Markdown 不支持视频嵌入;你可能只能保留链接,或者直接保留原始 HTML。
  • Base64 图片: 有些转换器会把 base64 数据直接塞进 Markdown,这会让文件变得特别大;更好的做法是提取图片并改成链接 (Reddit).
  • 复杂表格: 如果表格里有合并单元格或嵌套元素,Markdown 可能没法完整保留结构——这时候就得测试并按情况调整。

处理图片、链接和表格

图片:

  • <img src="logo.png" alt="Logo"> 会变成 ![Logo](logo.png)
  • 如果你不想保留图片,可以用 ignore_imagesstrip=['img']

链接:

  • <a href="url">text</a> 会变成 [text](url)
  • 内联式和引用式:markdownify 默认用内联式;html2text 可以输出引用式。
  • 如果是 AI 训练数据,你也许会想去掉 URL,只保留锚文本。

表格:

  • markdownify 和 Pandoc 可以把 HTML 表格转成 Markdown 表格(用竖线和横线)。
  • html2text 可能只输出纯文本形式的表格。
  • 对于复杂表格,务必检查结果,再按需要调整。

反过来:在 Python 中把 Markdown 转成 HTML

有时候你需要把 Markdown 再转回 HTML——比如要在网站上展示内容。Python 做这件事也很轻松。

使用 Python-Markdown:

import markdown

md_text = "# Hello\nThis is **Markdown**."
html_output = markdown.markdown(md_text)
print(html_output)

结果:

<h1>Hello</h1>
<p>This is <strong>Markdown</strong>.</p>

其他可选工具还有 Mistune 和 markdown2。当然,Pandoc 也支持双向转换。

HTML 转 Markdown 的局限与最佳实践

说实话,HTML 转 Markdown 并不是十全十美的。下面这些点你得特别留意,它们也能帮你拿到更好的结果。

局限性

  • 并不是所有内容都能顺利转换: 脚本、样式、表单和交互元素通常会被丢掉 (Aspose Docs).
  • 可能需要手动清理: 有时候你得自己整理生成的 Markdown,比如修正换行、调整表格,或者把残留的 HTML 清掉。
  • 不同 Markdown 风格有差异: 并不是所有渲染器都支持同样的功能,比如表格、脚注等。一定要在目标环境里测试输出。

最佳实践

  • 先清洗 HTML: 可以先用 BeautifulSoup 或可读性提取工具,把真正需要的内容提出来 (cantoni.org).
  • 大项目尽量自动化: 写脚本批量转换文件,并把它接进网页抓取或文档流程里。
  • 测试并迭代: 先拿样本跑一遍,在目标工具里检查 Markdown,再根据结果调整流程。
  • 优雅处理错误: 如果遇到格式不规范的 HTML,先清洗或修复,再去转换。

结论与核心要点

不管你是在写文档、准备 AI 训练数据,还是只是想让笔记别那么“硬核”,在 Python 里把 HTML 转 Markdown 都是一项很实用、也很有价值的技能。下面快速回顾一下:

Conclusion & Key Takeaways.png

  • 为什么重要: Markdown 比 HTML 更简洁、更易读,也更好管理。它已经成了现代文档和笔记场景里的通用语言之一 (Markdown Guide).
  • 最佳工具: 对大多数人来说,先用 markdownify 或 html2text。复杂任务交给 Pandoc。要是你需要企业级功能,Aspose 也值得考虑。
  • 怎么做: 安装你选的库,跑一个简单脚本,就能得到干净的 Markdown 输出;需要时再做定制。
  • 局限性: 可能还是要做一些手动整理,而且不是所有 HTML 特性都有对应的 Markdown 表达方式。
  • 下一步: 把示例代码用到你自己的 HTML 上。批量转换旧网页。把转换流程接到业务工作流里。如果你想再往前一步,也可以去看看 Pandoc 的高级功能,或者 Python-Markdown 的扩展。

Markdown 的核心价值,就是让内容更便携、更易读,也更能跟上未来的变化。只要有 Python 和合适的工具,你甚至能把最乱的 HTML 变成团队和未来的你都会感谢的内容。

祝你转换顺利!如果你还想了解更多自动化技巧、AI 驱动的数据抓取,或者单纯想看看数据工作流的“硬核玩法”,欢迎去看看 Thunderbit Blog,里面有更多实战指南和一线经验分享。

常见问题

1. 对商业用户来说,把 HTML 转成 Markdown 有什么好处?

把 HTML 转成 Markdown 能提升内容的可读性、可移植性和可维护性。它特别适合文档、笔记、AI 训练数据,以及把旧内容迁到支持 Markdown 的现代工具中。

2. Python 中哪些工具最适合 HTML 转 Markdown?

常见工具包括 markdownify(适合结构化输出)、html2text(适合快速、简洁的转换)、Pandoc(适合复杂文档),以及 Aspose.HTML(企业级商业方案)。

3. 我该怎么用 Python 把 HTML 转成 Markdown?

你可以用 markdownifyhtml2text 这类库。先用 pip 安装库,把 HTML 内容传进去,工具就会返回 Markdown。每个库都支持一些定制选项,比如去标签、控制输出格式等。

4. HTML 转 Markdown 有哪些限制?

有。像脚本、表单这类交互元素通常没法很好转换,复杂表格或嵌入式媒体也可能需要手动调整。另外,不同 Markdown 风格之间也有细微差别,这会影响最终渲染结果。

5. 我可以用 Python 把 Markdown 再转回 HTML 吗?

当然可以。像 markdownmistunemarkdown2 这样的库都能把 Markdown 渲染成 HTML,很容易集成到网页或其他基于 HTML 的系统中。

延伸阅读:

Shuai Guan
Shuai Guan
Thunderbit 首席执行官|AI 数据自动化专家 Shuai Guan 是 Thunderbit 的首席执行官,也是密歇根大学工程学院校友。凭借近十年的科技与 SaaS 架构经验,他专注于将复杂的 AI 模型转化为实用、免代码的数据提取工具。在本博客中,他分享自己经过实战检验、毫无保留的网页爬取与自动化策略,帮助您构建更智能、以数据为驱动的工作流。当他不在优化数据流程时,也会将同样的细致投入到摄影爱好中。
Topics
Html To MarkdownConvert Html To MarkdownPython Markdown To Html
目录
Thunderbit · AI 网页数据助手

1 次点击 内提取任意页面的数据

25 万+ 用户信赖
提供免费方案
从网页到表格
描述你需要的内容——Thunderbit 的 AI Agent 会帮你抓取并导出到 Excel、Google Sheets、Airtable 或 Notion。免费即可开始。
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week