Skip to content

HTML 转 Markdown 转换器

在浏览器中将 HTML 转换为干净的 Markdown——支持 GFM 表格、任务列表和链接。可选 ATX/Setext 标题及内联或引用链接。非常适合迁移网页内容或喂给 LLM。100% 私密,无需上传。

无追踪 浏览器中运行 免费
一切都在你的浏览器中运行。你的 Markdown 和 HTML 绝不会离开你的设备。
HTML
标题
链接
Markdown
已对照 CommonMark/GFM 输出、有损转换行为和标题/链接风格选项进行验证 — Go Tools 工程团队 · 2026年6月5日

什么是 HTML 转 Markdown?

HTML 转 Markdown 会取一份渲染后的 HTML 文档——浏览器所显示的标签、属性和嵌套——并把它改写成 Markdown,即那种为书写和版本控制而生的轻量纯文本格式。如果说 Markdown 转 HTML 是把紧凑文本展开成用于显示的标记,那么这就是相反且做减法的方向:你从丰富、冗长的 HTML 出发,把它提炼成 Markdown 所提供的那一小套可读约定。

在底层,转换器把你的 HTML 解析成一棵 DOM 树——与浏览器构建的节点结构相同——然后遍历那棵树,为它识别的每个节点输出 Markdown 等价物。<h2> 变成 ## ,<strong> 变成 **text**,<ul> 变成项目符号列表, 变成链接,<table> 变成 GFM 管道表格。遍历真实的 DOM,而不是对原始字符串跑正则表达式,正是它能正确处理嵌套列表、混合内联格式和表格、而不在边缘情况上出错的原因。

当你是在迁出 HTML、而非迁入它时,会用到这种转换。被困在 CMS、所见即所得编辑器、旧网页或富文本字段里的内容难以 diff、难以审阅、难以迁移。把它转换为 Markdown 能将其解放为一种在 Git 仓库、静态站点生成器或笔记应用中安然存在的格式——并且越来越成为大语言模型能高效阅读的格式。诚实的工具会直言其代价:转换是有损的——HTML 能表达 Markdown 无法表达的东西,所以一些结构和每一处样式细节都被有意丢弃,以换取干净、可移植的文本。

反向操作——Markdown 转回 HTML,供你准备好发布或预览时使用——同样有用。切换到 Markdown → HTML 标签页,或打开专门的 Markdown 转 HTML 转换器

HTML in:

  <h2>Pricing</h2>
  <p>Plans start at <strong>$9/mo</strong>. See the <a href="https://example.com/pricing">details</a>.</p>
  <table>
    <thead><tr><th>Plan</th><th>Price</th></tr></thead>
    <tbody><tr><td>Pro</td><td>$9</td></tr></tbody>
  </table>

Markdown out:

  ## Pricing

  Plans start at **$9/mo**. See the [details](https://example.com/pricing).

  | Plan | Price |
  | ---- | ----- |
  | Pro  | $9    |

  <!-- <div>, classes, and inline styles in the source are dropped — Markdown can't represent them. -->

核心功能

GFM 感知输出

以 GitHub Flavored Markdown 为目标,而非仅仅纯 CommonMark:HTML 表格变成管道表格,复选框 <li> 变成任务列表(`- [x]`),<del>/<s> 变成 ~~删除线~~。这份 Markdown 可直接放进 README、GitHub issue 或文档站点,并以相同方式渲染。

ATX 或 Setext 标题

选择井号前缀的 ATX 标题(# H1)或加下划线的 Setext 标题(H1 用 ===,H2 用 ---)。Setext 只覆盖前两个级别,所以转换器会对 H3 及更深层自动回退到 ATX——你绝不会得到无效的标题。

内联或引用链接

在内联链接——[text](url) 紧挨散文——和引用链接(把每个 URL 收集进文档脚部的编号列表)之间切换。引用风格让链接密集的段落保持可读,并能按标签复用某个 URL。

围栏代码块

一个 <pre><code> 块会变成带三个反引号的围栏代码块,<code> 元素上的 language- 类会作为围栏的信息串延续下来。内联 <code> 变成反引号 span,使代码片段完整地走完整段旅程。

处理嵌套列表和表格

遍历真实的 DOM,所以嵌套的 <ul>/<ol> 结构会转换成正确缩进的 Markdown 列表,有序列表从 1 重新编号。简单表格扁平化为管道表格;真正复杂的则回退为原始 HTML,而非丢失数据。

100% 私密,浏览器内运行

每一次转换都用 JavaScript 在本地进行——你的 HTML 和生成的 Markdown 绝不离开你的设备,绝不触及服务器,并在页面加载后离线工作。可安全用于内部 CMS 导出、客户内容和未发布的页面。

示例

网页 <table> 转 GFM 管道表格

<table>
  <thead><tr><th>Region</th><th>Sales</th></tr></thead>
  <tbody>
    <tr><td>EMEA</td><td>1,204</td></tr>
    <tr><td>APAC</td><td>980</td></tr>
  </tbody>
</table>
| Region | Sales |
| ------ | ----- |
| EMEA   | 1,204 |
| APAC   | 980   |

一个抓取或复制来的 HTML <table> 会坍缩成一个 GitHub Flavored Markdown 管道表格。<thead> 行变成表头,带短横线的分隔行会为你生成,每个 <tr> 变成一行管道分隔的内容——可直接放进 README 或文档页。

链接:内联 vs 引用风格

<p>Read the <a href="https://example.com/guide">setup guide</a> and the <a href="https://example.com/api">API reference</a>.</p>
Inline:
Read the [setup guide](https://example.com/guide) and the [API reference](https://example.com/api).

Reference:
Read the [setup guide][1] and the [API reference][2].

[1]: https://example.com/guide
[2]: https://example.com/api

同样的锚点有两种渲染方式。内联把 URL 留在文本旁边;引用风格把每个 URL 移到文末的编号列表中,当一句话带多个链接时能让长段落保持可读。用「链接」单选框选择风格。

嵌套的 <ul>/<ol> 转缩进的 Markdown 列表

<ul>
  <li>Build
    <ol>
      <li>Compile</li>
      <li>Bundle</li>
    </ol>
  </li>
  <li>Ship</li>
</ul>
- Build
  1. Compile
  2. Bundle
- Ship

嵌套通过缩进保留:内层 <ol> 缩进两个空格位于其父 <li> 之下,并从 `-` 项目符号切换到 `1.` 编号。Markdown 会自动重新编号有序列表,所以即便 HTML 用了显式的 value 属性,源码也保持干净。

一段网页 HTML 转干净的 Markdown

<article>
  <h1>Changelog</h1>
  <p>We shipped <strong>dark mode</strong> and fixed <code>parseDate()</code>.</p>
  <blockquote><p>Thanks to everyone who reported it.</p></blockquote>
</article>
# Changelog

We shipped **dark mode** and fixed `parseDate()`.

> Thanks to everyone who reported it.

粘贴一段真实页面——<article> 外壳被丢弃(Markdown 没有容器元素),<h1> 变成 `#`,<strong> 变成 `**`,内联 <code> 变成反引号,<blockquote> 变成 `>` 行。没有 Markdown 等价物的结构性外壳就此消失。

如何将 HTML 转换为 Markdown

  1. 1

    粘贴你的 HTML

    放入一份复制的网页、一份 CMS 或所见即所得编辑器的导出,或一段抓取来的 HTML 片段。DOM 会在你粘贴时于浏览器中被解析并序列化为 Markdown——无需上传,除浏览器内存外没有大小上限。

  2. 2

    选择标题和链接风格

    选择 ATX(#)或 Setext(===)标题,以及内联或引用链接。Markdown 会实时重新渲染,让你即时对比各种风格。输出以 GitHub Flavored Markdown 为目标——包含表格、任务列表和删除线。

  3. 3

    复制或下载

    点击「复制」获取 Markdown,或点击「下载」保存为 .md 文件。要反向操作,切换到 Markdown → HTML 标签页并粘贴你的 Markdown,即可得到渲染后的 HTML。

常见误区

指望 <div>/<span> 结构存活

通用容器没有 Markdown 等价物,所以会被脱壳——它们的内容保留,但标签连同其上任何类或样式都消失。如果你的版式依赖某个包裹 <div> 或一个带样式的 <span>,那种样式在 Markdown 里就没了。这是预期,不是 bug;Markdown 根本无法表达它。

✗ 错误
<div class="callout warning"><span style="color:red">Heads up!</span></div>
<!-- expecting the callout box and red colour to survive -->
✓ 正确
Heads up!
<!-- container and styles dropped; only the text remains in Markdown -->

段落内丢失的 <br> 换行

段落内的 <br> 是一个软换行,Markdown 用换行前的两个末尾空格(或一个反斜杠)来表示。粘贴 HTML 并指望可见的换行存活,可能在相邻行重排成一行时让你意外。转换器会输出硬换行形式,但如果你之后手动编辑,请不要删掉那两个末尾空格。

✗ 错误
Line one<br>Line two
<!-- if the break form is removed, these merge into one line -->
✓ 正确
Line one  
Line two
<!-- two trailing spaces preserve the <br> as a hard break -->

深度嵌套表格退化

GFM 管道表格不能嵌套或容纳块级内容。一个把表格(或列表、或多个段落)放进单元格的遗留布局,无法变成干净的管道表格——转换器尽量扁平化它能处理的部分,并把其余留作原始 HTML,使一切不丢失。修复之道是简化源,而非简化输出。

✗ 错误
<table><tr><td><table><tr><td>inner</td></tr></table></td></tr></table>
<!-- nested table can't become a flat pipe table -->
✓ 正确
<!-- Flatten to a single-level table first: -->
<table><tr><td>inner</td></tr></table>
→ | inner |
  | ----- |

指望 <script> 或样式存活

<script>、<style> 和头部级元素是代码和呈现,不是文档内容,所以会被完全剥离——不转换,也不保留为原始 HTML。粘贴整页并指望行为或 CSS 带进 Markdown,会让你失望。Markdown 是内容格式;如果你需要代码或样式,请保留 HTML。

✗ 错误
<style>.x{color:blue}</style>
<script>track()</script>
<p>Body</p>
<!-- expecting the style and script to come through -->
✓ 正确
Body
<!-- only the content survives; <script>/<style> are dropped -->

常见使用场景

把网页或 CMS 内容迁入 Notion、Obsidian 或静态站点
把页面从 CMS、WordPress 导出或旧 HTML 站点中拉出来,转换成可直接放进 Notion、Obsidian、Hugo 或 Jekyll 的 Markdown。你用冗长的标记换来可移植的文本,它能在 Git 仓库中干净存放,并在审阅时合理地 diff。
从所见即所得编辑器导出
富文本编辑器会产出密集、属性繁多的 HTML。把那份输出粘到这里,恢复其底下干净的 Markdown——标题、列表、链接和强调——这样内容就能迁入文档流程或基于 Markdown 的知识库,而不必锁死在编辑器里。
把 HTML 清洗成 Markdown 以喂给 LLM 和 RAG 流程
原始 HTML 把 token 烧在模型从不需要的标签、脚本和样式上。把抓取来的页面转换为 Markdown 能剥离这些噪声,同时保留 LLM 读得很好的结构,于是你能在上下文窗口里塞进更多真正的内容,并为检索得到更干净的嵌入。
把富文本粘贴转换为 Markdown
从网页、邮件或文档复制带格式的文本,它会作为 HTML 到达剪贴板。把它粘到这里,把那段富文本变成你可以提交、放进 pull request 或写进笔记的 Markdown——格式保留,杂乱清除。
把页面归档为 Markdown
把一个网页有意义的内容存为一个小巧、面向未来的 .md 文件,而不是一份满是脚本和追踪代码的沉重 HTML 快照。Markdown 几十年后在任何文本编辑器中仍保持可读,且只占一小部分空间。
把遗留的 HTML 文档变成 Markdown
用手写 HTML 编写的旧文档维护起来很痛苦。把它转换为 Markdown,带进现代的文档即代码工作流——在那里它可以被 lint、在 pull request 中审阅,并由静态站点生成器渲染。

技术细节

CommonMark 与 GitHub Flavored Markdown 输出
转换器可以目标为纯 CommonMark,或者(默认)GitHub Flavored Markdown 超集。CommonMark 精确定义了标题、强调、列表、链接、图片、代码和引用块。GFM 增加了四种可直接从常见 HTML 映射的构造:<table> → 管道表格、复选框列表项 → 任务列表、<del>/<s> → 删除线、裸 URL → 自动链接。由于大多数网页内容都用到表格之类,GFM 输出是实用的默认;仅当目标渲染器不理解 GFM 扩展时才选 CommonMark,此时表格会回退为原始 HTML。
有损、不可逆的转换——直言不讳
HTML 严格地比 Markdown 更具表现力,所以转换不可能无损,把这点说在前头是值得的。Markdown 没有表示 <div>、<span> 或其他通用容器的语法;没有承载类名、id、内联 style、colspan/rowspan 或任意 data-* 属性的方式;也没有对大多数语义或布局元素的表示。这些要么被脱壳(保留内容、丢弃标签),要么被丢弃(属性),要么——当丢弃会损失含义时——被保留为原始内联 HTML。HTML → Markdown → HTML 的往返不会重现原文。这是有意的取舍:Markdown 的存在是为了干净、可 diff、人类可编辑,而非镜像 HTML。大多数竞品对此含糊带过;把它说清楚,能让你睁着眼睛决定 Markdown 是否是合适的目标。
风格取舍:ATX/Setext、内联/引用、围栏/缩进
三个输出选择各有实在的取舍。ATX 标题(#)覆盖全部六个级别且便于 grep;Setext(加下划线)只存在于 H1/H2,所以工具为前两级输出它,往下回退到 ATX。内联链接把 URL 留在文本旁——最适合稀疏链接;引用链接把 URL 拉到文档脚部——最适合链接密集的散文和按标签复用。对于代码,围栏块(三个反引号)能携带语言信息串并安全嵌套,而缩进(四空格)代码块无法表达语言、且在列表内会出错——所以本转换器始终从 <pre><code> 输出围栏块。

最佳实践

在转换前先格式化 HTML
压缩过或深度缠绕的 HTML——尤其是嵌套布局表格和零散的内联元素——在先被整理成良构后转换得更干净。把杂乱的源跑一遍我们的 HTML 格式化工具 来美化排版并规范化它,然后再转换。干净的输入产出干净的 Markdown,更少回退到原始 HTML。
预期并审阅有损的丢弃
把转换当作设计上有损的。类名、内联样式、<div>/<span> 外壳和奇异属性在输出中都没了,而这通常正是你想要的可移植 Markdown——但请扫一遍结果,看看是否有仅存于某个属性中的语义重要信息(一个 aria-label、一个 colspan 合并的单元格),如果它重要,就手动补回去。
按文档的链接密度选择链接风格
对于偶尔出现一两个链接的散文,用内联链接——URL 留在它的文本旁边,源码读起来自然。当某一节链接密集或复用相同 URL 时,切换到引用链接:把它们拉到文末的编号列表能让段落保持易扫读,并避免重复冗长的 URL。
把页面发给 LLM 前先转成 Markdown
当你把网页内容喂给模型时——用于提示词、嵌入或 RAG 存储——先把 HTML 转成 Markdown。你会剥离浪费 token 并增加噪声的标签、脚本和样式,保留模型真正用到的结构,并在上下文窗口里塞进多得多的真正内容。
转换后核对复杂表格
GFM 管道表格是扁平的——没有嵌套表格、单元格内没有块级内容、没有合并单元格。在转换一个数据密集或布局型表格后,请核对 Markdown:简单网格转换得很完美,但任何带 colspan 或嵌套块的都会退化,可能以原始 HTML 出现。如果你在意一个干净的管道表格,请先简化源表格。

常见问题

内联链接和引用链接是如何处理的?
用「链接」单选框选择。内联风格把每个锚点写成 [text](url) 就在它出现的位置——对每段一两个链接来说紧凑而直观。引用风格在散文中写 [text][1],并把所有 URL 作为 [1]: https://… 定义收集到文档底部,这能让带许多链接的文本保持可读,还能按标签复用某个 URL。两者产生的渲染输出完全相同;这纯粹是源码可读性的选择。图片遵循同样的规则:一个 <img> 在内联模式下变成 ![alt](src),在引用模式下变成 ![alt][1]。
ATX 与 Setext 标题——我该用哪个?
ATX 标题在行首加井号——# H1、## H2、### H3——并适用于全部六个级别。Setext 标题则给文本加下划线:一行 = 在某行之下使其成为 H1,一行 - 使其成为 H2。问题在于 Setext 只存在于第 1、2 级,所以本转换器为 <h1>/<h2> 输出 Setext,并对 <h3> 及更深层自动回退到 ATX。ATX 更常见、更可移植,也更便于 grep;仅当下游样式指南或 linter 要求时才选 Setext。
Markdown 无法表示的 HTML(如 <div> 和 <span>)会怎样?
Markdown 没有表示通用容器的语法,所以像 <div>、<span>、<section> 和 <article> 这样的结构性外壳会被脱壳——它们的文本和子元素被保留,但标签本身消失,因为 Markdown 中没有可映射之物。类名、id 属性、内联 style 属性和 data-* 属性出于同样原因被丢弃:Markdown 没有任何方式表达它们。当一个元素确实没有 Markdown 等价物且丢弃它会损失含义时,转换器会把它保留为原始内联 HTML,而非悄悄删除内容。这是有意为之——参见关于转换是否无损的那个问题。
它会剥离 <script> 和样式吗?
会。<script> 和 <style> 元素连同其内容会被完全移除——它们是代码和 CSS,不是文档内容,在 Markdown 中无处安放。当你粘贴整个页面时,<link>、<meta> 和其他头部级元素也一样被移除。像 onclick 这样的内联事件处理器和 style 属性中的 CSS 也会被丢弃。结果只剩文本内容,这正是当 Markdown 要去往文档仓库、静态站点生成器或 LLM 上下文窗口时你所需要的。如果你需要保留样式,那 Markdown 就是错误的目标格式。
嵌套表格和列表是如何处理的?
嵌套列表转换得很干净:<ul>/<ol> 的每一层嵌套变成两个空格的缩进,有序列表从 1 重新编号。表格则更棘手。GitHub Flavored Markdown 的管道表格按规范是扁平的——一个表格单元格不能包含另一个表格,也不能包含列表或多个段落这样的块级元素。所以一个简单的 <table> 会转换成干净的管道表格,但单元格内含嵌套表格、或含块级内容的表格会退化:转换器尽量扁平化它能处理的部分,并把复杂部分保留为原始 HTML,使数据不丢失。来自旧页面的深度嵌套布局表格是最糟的情况——可以考虑先简化 HTML。
HTML 转 Markdown 是无损的吗?
不是,而且坦诚这一点很重要。HTML 远比 Markdown 更具表现力:它有数百个元素和任意属性,而 Markdown 只覆盖一个小而克制的集合——标题、强调、列表、链接、图片、代码、引用块,以及(在 GFM 下)表格、任务列表和删除线。该集合之外的一切都没有表示:colspan、自定义属性、内联样式、<div>/<span> 结构,以及大多数语义外壳,要么被丢弃,要么仅保留为原始 HTML。HTML → Markdown → HTML 的往返不会逐字节重现原文。转换是有意为之的有损——目标是干净、可移植、人类可编辑的文本,而非忠实的往返。要反向操作,请使用我们的 Markdown 转 HTML 转换器
我能把 Markdown 喂给 LLM 或 ChatGPT 吗?
能——这是最好的现代用途之一。原始 HTML 把 token 浪费在模型不需要的标签、属性、脚本和样式上,这些噪声还会在 RAG 流程中降低检索质量。把页面转换为 Markdown 能剥离这些开销,同时保留模型读得很好的结构:标题成为层级,列表仍是列表,表格仍是表格,链接仍是链接。输出通常只是原始 HTML token 数的一小部分,所以你能在上下文窗口里塞进更多真正的内容。把抓取来的页面粘到这里,复制 Markdown,再放进你的提示词、嵌入步骤或文档存储。
我的文件会被上传到服务器吗?
不会。转换完全在你的浏览器中进行:HTML 被解析成 DOM,并用 JavaScript 在本地序列化为 Markdown,没有任何内容被传输、存储或记录。你可以打开浏览器的「网络」标签页确认——转换会触发零次网络请求。这让该工具可安全用于内部 CMS 导出、未发布的页面、客户内容以及任何受 NDA 约束的东西。这里没有上传步骤,也没有大小上限,只受限于你的浏览器能舒适容纳在内存中的量。
它能离线工作吗?
能,只要页面加载完成。DOM 解析器和 Markdown 序列化器都在浏览器中运行,没有任何服务器往返,所以你可以在断网状态下转换——在飞机上、严格防火墙之后,或任何你宁愿页面绝不离开机器的时候。这直接源自隐私优先的设计:既然没有任何东西被发往别处,工具在初次加载后也就不需要网络做任何事。
我能把 Markdown 转回 HTML 吗?
可以。切换到 Markdown → HTML 标签页,或打开专门的 Markdown 转 HTML 转换器,粘贴你的 Markdown,即可得到带实时预览、完整 GFM 支持,以及片段、完整文档或邮件内联输出的渲染 HTML。两个方向相辅相成:用 HTML → Markdown 把现有网页内容拉入 Markdown 工作流,用 Markdown → HTML 来发布或预览它。如果源 HTML 很杂乱,我们的 HTML 格式化工具 可以在转换前把它整理好。