文本处理 本地计算 开箱即用 内置示例 不留痕迹

HTML 转 Markdown

把排版好的网页内容搬进 Markdown 文档(README、文档站、笔记软件)时,手工删标签非常费时。本工具解析 HTML 结构后按 Markdown 语法重新输出:标题成 #、列表成短横线、表格成 GFM 表格,脚本与样式整块丢弃,正文里的星号、下划线自动转义以免被当成格式。

把网页内容搬进 Markdown 文档(README、文档站、笔记软件)时,手工删标签很费时:标题要加井号、列表要换短横线、表格要补分隔行。这个工具解析 HTML 结构后按 Markdown 语法重新输出,常用于整理富文本编辑器导出的内容,或转存网页正文。

两点预期需要说明:script、style、HTML 注释与 DOCTYPE 会连内容一起整块丢弃 —— 把 CSS 规则或 JavaScript 粘进 Markdown 只会变成噪声;表格的合并单元格(colspan / rowspan)与复杂嵌套布局无法用 Markdown 表达,转换后会退化为普通单元格,需要人工补齐。

使用步骤

  1. 从「查看源代码」或后台编辑器源码里复制 HTML,粘进输入框。
  2. 点转换得到 Markdown;正文里的星号、下划线会自动转义,避免被当成格式。
  3. 核对三处:表格是否为 GFM 表格、代码块是否为三反引号、合并单元格是否需人工调整。
  4. 粘进目标编辑器后预览一次,确认渲染符合预期。

计算原理与示例

支持的标签与对应写法

块级标签的处理是:h1~h6 转成 1~6 个 #;p 与 div 转成空行分隔的段落;ul/ol 的 li 转成 - 与序号(嵌套列表缩进两个空格);blockquote 每行前面加 >;pre 转成三反引号代码块(class 里的 language-xx 会带上语言名);hr 转成 ---;br 转成「行尾两个空格 + 换行」。行内标签:strong/b 转成两个星号,em/i 转成一个星号,del/s/strike 转成两个波浪号,a 转成方括号加圆括号,img 转成感叹号加方括号,code 用反引号。

为什么有些内容不见了

script、style、HTML 注释与 DOCTYPE 都是整块丢弃(连标签里的内容一起),因为它们不属于正文——把 CSS 规则或 JavaScript 粘进 Markdown 只会变成一大段噪声。如果确实要保留脚本文字,可以先用「去 HTML 标签」工具把标签剥掉、只留文本,再自己整理。

转义与表格这两处特别说明

两处需要特别说明。第一是转义:正文里的星号、下划线、方括号、波浪号、反引号与反斜杠都会加上反斜杠前缀,避免它们被当成 Markdown 语法;但由标签生成的那部分标记不转义,所以加粗仍然是加粗。第二是表格:Markdown 的表格必须有表头行,因此原 HTML 里即使没有 th,也会把第一行当作表头——这是 GFM 的硬性要求,不是转换错误。

代码示例

JavaScript Node 里转换(turndown)

import TurndownService from 'turndown';

const td = new TurndownService({
  headingStyle: 'atx',       // 用 # 而不是下划线式标题
  codeBlockStyle: 'fenced',  // 用三反引号
  bulletListMarker: '-',
});
td.remove(['script', 'style']); // 整块丢弃,避免噪声

console.log(td.turndown('<h1>标题</h1><p>正文 <b>加粗</b></p>'));
// # 标题
//
// 正文 **加粗**

Shell 命令行转换(Pandoc)

# HTML → Markdown(-t gfm 输出 GitHub 方言)
pandoc -f html -t gfm --no-highlight in.html -o out.md

# 顺手把外链图片改成本地相对路径(已下载图片到本地时)
sed -i "" "s#https://example.com/assets/##g" out.md

# 提示:批量替换先备份,改完 diff 一眼确认

常见问题

转换后加粗变成了两个星号,但我的编辑器里没生效?

先确认编辑器用的是 Markdown 模式而不是富文本模式——很多「所见即所得」编辑器会把两个星号原样显示。其次是确认星号两侧没有多余空格(Markdown 要求 ** 紧贴文字)。本工具生成的是标准的 **文字** 写法,在 GitHub、Typora、VS Code、语雀等常见环境都能正常渲染。

为什么 script 和 style 里的内容不见了?

这是刻意行为。脚本与样式不属于正文,粘进 Markdown 文档只会变成难以阅读的大段噪声,而且内含的花括号、分号很容易破坏文档结构。工具会连同标签一起整块丢弃。若你确实需要里面的文字,先用「去 HTML 标签」工具剥出纯文本,再手工整理。

表格里的合并单元格能还原吗?

不能,会退化成普通单元格。Markdown(含 GFM)的表格语法本身不支持跨行跨列的合并,任何转换工具都只能做降级处理:合并格的内容会出现在第一个单元格,被合并的位置留空。需要保留合并效果时,只能在目标文档里改用 HTML 表格或图片。

HTML 里的事件属性(onclick 等)和行内样式会保留吗?

全部丢弃。转换只取「标签种类 + 文字内容 + 链接与图片地址」这三类信息,class、id、style、onclick、data-* 等属性在 Markdown 里没有对应写法,留着也没有意义。这也是这个工具可以安全用于处理来源不明 HTML 的原因之一。

嵌套列表转换后的缩进看起来偏大,是错了吗?

不是错。每一层嵌套在 Markdown 里固定缩进两个空格,这是最通用的写法;三层嵌套就是六个空格。部分渲染器对「空行 + 缩进」的松散列表解析略有差异,如果目标平台显示异常,可以把空行删掉让列表变紧凑,效果通常更稳定。

从网页上「查看源代码」复制一大堆 HTML 粘进来可以吗?

可以,但建议先只复制正文那一段。整页源码里包含导航、页脚、埋点脚本等大量非正文结构,转换后你会得到一份很长的、包含广告位文字的 Markdown,清理成本比手工复制的还高。浏览器里用「复制元素」或阅读模式取到正文区域,效果最好。

正文里的星号被加了反斜杠,是转换出错了吗?

是刻意加的转义。Markdown 里星号和下划线是格式标记,如果不加反斜杠,正文中的「2*3」可能被解释成斜体开头,导致后面一大段文字排版错乱。加反斜杠(\*)后渲染器会原样输出星号。若目标环境不需要转义,把「转义特殊字符」关掉即可。

转换结果在 GitHub 上显示正常吗?

常用结构(标题、列表、引用、代码块、表格、链接图片、删除线)都按 GFM 规范输出,可以在 GitHub、GitLab 的 README 里直接使用。唯一需要留意的是硬换行:本工具用「行尾两个空格」,这是 CommonMark 标准写法,但在某些会自动裁剪行尾空格的编辑器里保存后会失效,此时可以把换行改成空行分段。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。