什么是 HTML 转 Markdown 转换?
HTML 转 Markdown 转换是将 HTML 标记转化为 Markdown 的过程。Markdown 是一种轻量级纯文本格式语法,由 John Gruber 于 2004 年创建。Markdown 的设计目标是不经渲染也能直接阅读。HTML 需要开闭标签(如 <strong> 和 <a href="">),而 Markdown 使用简写字符:**粗体**、[链接](url) 和 # 标题。将 HTML 转换为 Markdown 所生成的文件,比原始 HTML 更易阅读、编辑和进行版本控制。
转换过程将 HTML 元素映射为对应的 Markdown 语法。<h2> 变为 ##,<ul><li> 变为 - 列表项,<a> 标签变为 [文本](url)。部分 HTML 元素在 Markdown 中没有对应语法,例如 <div>、<span> 或自定义数据属性。转换器通常会根据配置去除这些标签,或将其作为原始 HTML 直接传递。
Markdown 已成为开发者文档(GitHub、GitLab、Bitbucket)、静态网站生成器(Hugo、Jekyll、Astro)、笔记应用(Obsidian、Notion)和技术博客的标准写作格式。将现有 HTML 内容转换为 Markdown,是网站迁移、导入 CMS 内容或以可移植格式归档网页时的常见步骤。与 HTML 不同,Markdown 文件在版本控制中能产生清晰的差异对比,使文档变更的代码审查切实可行。
为什么使用 HTML 转 Markdown 转换器?
手动将 HTML 改写为 Markdown 既耗时又容易出错,尤其是含有嵌套列表、表格或大量链接的页面。自动化转换器能即时且一致地完成结构映射。
HTML 转 Markdown 使用场景
HTML 转 Markdown 元素对照参考
下表展示了常见 HTML 元素与对应 Markdown 语法的映射关系。该映射遵循 GitHub-Flavored Markdown(GFM)规范,GFM 在 CommonMark 规范基础上扩展了表格、删除线和任务列表。未在此列出的元素(如 <div>、<form> 或自定义 Web 组件)在 Markdown 中没有对应语法,将被去除或作为原始 HTML 直接传递。
| HTML 元素 | Markdown 语法 | 说明 |
|---|---|---|
| <h1>...<h6> | # ... ###### | ATX headings, level matches tag number |
| <p> | Blank line separation | Double newline between paragraphs |
| <strong>, <b> | **text** | Bold / strong emphasis |
| <em>, <i> | *text* | Italic / emphasis |
| <a href="url"> | [text](url) | Inline link with optional title |
| <img src="url"> |  | Image with alt text |
| <ul><li> | - item | Unordered list with dash or asterisk |
| <ol><li> | 1. item | Ordered list, numbers restart per block |
| <blockquote> | > text | Block quote, nestable with >> |
| <code> | `code` | Inline code span |
| <pre><code> | ```lang\ncode\n``` | Fenced code block with optional language |
| <hr> | --- | Horizontal rule (three dashes) |
| <table> | | col | col | | GFM table syntax with alignment |
| <del>, <s> | ~~text~~ | Strikethrough (GFM extension) |
Markdown 方言:GFM vs CommonMark vs 原始规范
并非所有 Markdown 都相同。输出格式很重要,因为不同平台对 Markdown 的解析方式存在差异。最常见的三种方言是 GitHub-Flavored Markdown(GFM)、CommonMark 和 Gruber 的原始 Markdown。
代码示例
以下为 JavaScript(Turndown)、Python(markdownify 和 html2text)、Go 以及命令行 Pandoc 的实用示例。
import TurndownService from 'turndown'
const turndown = new TurndownService({ headingStyle: 'atx' })
const html = '<h1>Title</h1><p>A <strong>bold</strong> paragraph.</p>'
const md = turndown.turndown(html)
console.log(md)
// → "# Title\n\nA **bold** paragraph."from markdownify import markdownify html = '<h2>Section</h2><ul><li>First</li><li>Second</li></ul>' md = markdownify(html, heading_style='ATX') print(md) # → "## Section\n\n- First\n- Second"
import html2text converter = html2text.HTML2Text() converter.body_width = 0 # disable line wrapping html = '<p>Visit <a href="https://example.com">Example</a> for details.</p>' md = converter.handle(html) print(md) # → "Visit [Example](https://example.com) for details."
package main
import (
"fmt"
md "github.com/JohannesKaufmann/html-to-markdown"
)
func main() {
converter := md.NewConverter("", true, nil)
html := `<h3>Go Example</h3><p>Code: <code>fmt.Println()</code></p>`
markdown, _ := converter.ConvertString(html)
fmt.Println(markdown)
// → "### Go Example\n\nCode: `fmt.Println()`"
}# Convert an HTML file to Markdown pandoc input.html -f html -t markdown -o output.md # Pipe HTML from stdin echo '<p>Hello <em>world</em></p>' | pandoc -f html -t markdown # → Hello *world* # Use GitHub-Flavored Markdown output pandoc input.html -f html -t gfm -o output.md