HTML 转 Markdown 转换器
将 HTML 文档或网页片段一键转换为 Markdown 格式。基于浏览器原生 DOMParser 解析, 支持标题、列表、代码块、表格、引用、链接、图片、GFM 任务列表等完整语法。 可配置 ATX/Setext 标题风格、围栏/缩进代码块、列表标记符, 自动忽略 script/style 等非内容标签。与 Markdown 预览器形成双向转换闭环。
常见问题
为什么需要 HTML 转 Markdown?
Markdown 以纯文本形式存储,具有以下优势:
- 可读性强:源码即排版,无需渲染即可阅读
- 平台兼容:GitHub、GitLab、Notion、Obsidian、VS Code 等均原生支持
- 版本控制友好:纯文本 diff 清晰,便于团队协作
- 体积小:无 HTML 标签开销,传输与存储成本低
常见场景包括:将网页内容保存为笔记、从 WordPress/博客平台迁移到 Markdown 博客(如 Hugo/Astro)、 为 AI 训练数据准备纯文本、将富文本编辑器输出转为可版本控制的格式。
支持哪些 HTML 标签的转换?
本工具覆盖了 Markdown 语法能表达的所有 HTML 标签:
- 标题:h1 ~ h6 →
#~######(或 setext===/---) - 文本格式:strong/b →
**粗体**、em/i →*斜体*、del/s →~~删除线~~ - 代码:code →
`行内代码`、pre > code → 围栏代码块(自动提取语言标识) - 链接图片:a →
[text](url)、img → - 列表:ul →
-无序列表、ol →1.有序列表、支持任意层级嵌套 - GFM 任务列表:
<input type="checkbox">→- [x]/- [ ] - 表格:table → GFM 管道表格(含表头分隔行)
- 引用:blockquote →
> 引用(支持嵌套) - 其他:hr →
---、br → 硬换行、details/summary → 加粗标题 + 正文
script、style、template、noscript、iframe 等非内容标签会被自动忽略。
ATX 和 Setext 标题风格有什么区别?
ATX 风格(默认):用 # 号表示标题层级,支持 h1 ~ h6:
# 一级标题
## 二级标题
### 三级标题 Setext 风格:仅支持 h1 和 h2,用下划线表示:
一级标题
=======
二级标题
------- ATX 更通用(支持 6 级),Setext 更简洁(仅 2 级)。建议保持默认的 ATX 风格。
围栏代码块和缩进代码块有什么区别?
围栏代码块(默认):用三个反引号包裹,可指定语言标识:
```javascript
const x = 1;
``` 缩进代码块:每行缩进 4 个空格,无法指定语言:
const x = 1; 围栏代码块是 GFM 扩展,支持语法高亮,现代平台均支持。缩进代码块是原始 Markdown 规范,兼容性更老。
如何处理嵌套列表?
本工具完整支持任意层级的列表嵌套。子列表会自动缩进对齐:
- 一级项
- 二级项
- 三级项
- 二级项
- 一级项 缩进空格数可通过"缩进空格数"选项调整(默认 2 空格,CommonMark 规范要求至少 2 空格)。 有序列表和无序列表可混合嵌套。
转换后表格格式不正确怎么办?
GFM 管道表格要求:第一行必须是表头,第二行是分隔行(| --- | --- |)。
如果原始 HTML 表格没有 <th> 表头单元格,本工具会将第一行作为表头处理。
注意:GFM 表格不支持单元格内换行,多行内容会被合并为单行(用空格分隔)。
如需保留复杂表格结构,建议保留原始 HTML。
数据安全吗?会上传到服务器吗?
完全安全,数据不离开浏览器。本工具基于浏览器原生 DOMParser API 在本地解析 HTML, 所有转换逻辑在客户端 JavaScript 中执行,不发起任何网络请求。 打开浏览器开发者工具的 Network 面板即可验证无任何外发请求。适用于处理含敏感信息的 HTML 内容。
为什么不引入 Turndown 等成熟库?
三个核心考虑:
- bundle 体积可控:Turndown 约 40KB(gzip 13KB),而手写引擎约 12KB(gzip 4KB), 节省 28KB。本工具页单页加载远低于 200KB 红线。
- 安全可控:成熟库功能丰富但攻击面也大。本工具默认忽略 script/style 等标签, 从根本上避免 XSS 风险,无需引入额外净化库。
- 无外部依赖:项目坚持"纯原生零依赖"原则,便于维护与审计。