HTML 转 Markdown
把排版好的网页内容搬进 Markdown 文档(README、文档站、笔记软件)时,手工删标签非常费时。本工具解析 HTML 结构后按 Markdown 语法重新输出:标题成 #、列表成短横线、表格成 GFM 表格,脚本与样式整块丢弃,正文里的星号、下划线自动转义以免被当成格式。
把网页内容搬进 Markdown 文档(README、文档站、笔记软件)时,手工删标签很费时:标题要加井号、列表要换短横线、表格要补分隔行。这个工具解析 HTML 结构后按 Markdown 语法重新输出,常用于整理富文本编辑器导出的内容,或转存网页正文。
两点预期需要说明:script、style、HTML 注释与 DOCTYPE 会连内容一起整块丢弃 —— 把 CSS 规则或 JavaScript 粘进 Markdown 只会变成噪声;表格的合并单元格(colspan / rowspan)与复杂嵌套布局无法用 Markdown 表达,转换后会退化为普通单元格,需要人工补齐。
这个工具解决你的问题了吗?
提交后会把工具名、你的输入与当前结果发送到服务器;请勿填写身份证号、手机号等隐私信息。
AI 助手 会结合你当前的输入与结果回答
追问会再次把当前输入与结果发送到服务器;请勿填写隐私信息。
使用步骤
- 从「查看源代码」或后台编辑器源码里复制 HTML,粘进输入框。
- 点转换得到 Markdown;正文里的星号、下划线会自动转义,避免被当成格式。
- 核对三处:表格是否为 GFM 表格、代码块是否为三反引号、合并单元格是否需人工调整。
- 粘进目标编辑器后预览一次,确认渲染符合预期。
计算原理与示例
支持的标签与对应写法
块级标签的处理是: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 标准写法,但在某些会自动裁剪行尾空格的编辑器里保存后会失效,此时可以把换行改成空行分段。
延伸阅读
来自本站原创文章,讲清这个工具背后的算法与口径。