HTML 转 Markdown

自写子集转换器,覆盖标题/列表/表格/代码,其余标签按需保留。

认不出的标签原样保留链接用引用式写法
输入
输出

这是一个自写的 HTML→Markdown 子集转换器,不用 turndown、也不建任何 DOM 节点:整段输入按字符扫描建树,粘贴的内容不会被接入当前页面,脚本没有执行的机会;转换在浏览器内存里完成,不发请求。输出口径是 CommonMark 0.31 加 GFM 扩展(表格、删除线、任务列表),标题、强调、删除线、代码、列表、引用、链接与图片映射成 Markdown,p/div/section/article 一类容器只拆壳、不产生任何标记,剩下的走退化档。

它只实现子集,剩下的按三档退化:script、style、noscript、template、head、meta、link、title、base、svg、math、object、frame 一类永远丢弃,开了「原样保留」也不透传,HTML 注释同样直接跳过;sub/sup/u/kbd/mark 这些没有 Markdown 对应物的标签默认按 HTML 原样保留(GFM 允许正文混写 HTML),关掉开关就降级成纯文本。不规则表格整表退回 HTML 原样并写明原因——colspan/rowspan、thead 里的多级表头、某行列数与表头不齐、单元格里有列表/代码块/嵌套表格。链接与图片过安全关:javascript: 与 vbscript: 的地址直接丢掉只留文字,data: 只放行 png/jpeg/gif/webp/avif 图片。实体解码支持全部数字实体加几十个常见命名实体,认不出的原样保留并统计数量;标签没闭合或多出结束标签不抛错,按隐含结束规则就近补齐,个别结构可能与浏览器解析不同。

HTML 转 Markdown怎么用

  • 只复制正文容器:整页复制进来,同级的 div 会被拆壳、导航与页脚文案一并压进段落;先在源页面选中正文那一段再转。输入里一个标签都没有时按纯文本成段输出。
  • 三个开关:默认「MD 表格 + 原样保留开 + 内联链接」。目标渲染器不允许正文混 HTML 时关掉「认不出的标签原样保留」,让上标、details 降级成文本;链接密集、地址要统一维护时开「链接用引用式」,正文写成 [文字][标签],文末集中出定义块,同地址复用同一标签、异地址撞名时加序号。
  • 读 meta 与提示条:结果上方 meta 行统计链接、图片、表格单元格与总行数;提示条列出跳过的标签(附次数,最多列 14 种)、按 HTML 保留的标签、表格退回原因、实体解码数与相对路径图片数。没有复制按钮,Markdown 是普通可选中文本。缺 src 的 img 只剩 alt 文本,没有 alt 与用相对路径的图片都会单独提醒;未闭合标签的异常计数也在提示里注明。
  • 映射成 Markdown 的部分:h1–h6 按级别给井号(标题行里的「1. 」前缀不做列表转义)、strong/b 加粗、em/i 斜体、del/s/strike 删除线、行内 code 与 pre 代码块(围栏长度按内容里最长的反引号串自动加长,语言标识从 class="language-x"、lang 属性、brush: 这类写法里读,代码内容原样不转义)、ul/ol 保留任意嵌套(缩进跟着标记宽度走,两位序号自动加宽,ol 尊重 start 与 li 的 value)、复选框写 GFM 任务项、blockquote 每行加 >(嵌套引用写成 > > 并保留内层标记)、hr 转三横线、br 转行尾两空格的硬换行、a/img 出内联写法并保留 title(链接文字与地址相同时写成自动链接)。
  • 退化的另两档:sub/sup/u/kbd/mark/abbr/ins/q/time/font/ruby、定义列表 dl、details/summary、iframe/video/audio/picture 等默认按 HTML 原样保留;关掉该开关后它们降级成纯文本内容(dl 例外:dt 写成加粗行、dd 缩进两格,details 只留 summary 文字与内容),未知自定义标签同理,h7 这类不存在的标签也按未知标签处理。孤立出现在列表/表格之外的 li、tr、td、th 降级成段落。

常见问题

为什么从真实网页整页转出来的 Markdown 像一锅汤?

网页里的 div 是布局不是语义:导航、侧栏、正文、页脚常常是同级的 div 与 span,转换器无法从标签名判断哪块才是正文,而本工具对容器的处理是统一拆壳、文字压成段落,按钮文案与面包屑就一并混进来了。根治办法是只复制正文容器那一段再转;工具刻意不做「自动挑正文」——猜错的正文比一锅汤更难被发现。

表格单元里要换行、要合并单元格怎么办?

GFM 的行模型让单元格里放不下裸换行,工具的处理是:文本内换行写成 <br>、竖线转义,加粗与链接这类行内内容照常保留。合并单元格与多级表头在 Markdown 侧根本没有语法,硬转会把行列错位或把内容塞进错误的单元,所以宁可整表退回 HTML 并说明原因。真要保留合并语义就切「留 HTML 表格」,或者把结构拆成多张规则表。

为什么 sup/details 默认原样保留、div 却被拆掉,而 script 连保留的机会都不给?

取舍跟着 GFM 的能力走:正文混写 HTML 是合法语法,sub/sup/details/iframe 这些没有 Markdown 对应物、渲染器又普遍支持的标签,原样透传最保真;div/section 是纯容器,拆壳不丢内容。script、style、noscript 即便透传也是脚本执行与布局语义的来源,所以永远整块丢弃、只在提示里记一笔——「认不出的标签原样保留」这个开关对它们无效。

哪些表算「规则表」?表头和对齐怎么定?

GFM 表格是矩形网格,只有规则表转得动:表头取 thead 的第一行;没有 thead 时,整行都是 th 的首行也当表头(GFM 的表格必须有表头行)。对齐从 style、class、align 三处猜,写成 :--- / :---: / ---:;单元格内容压成一行,行比表头少列的用空单元格补齐并记账。

实体解码和转义的范围有多大?

实体解码支持全部数字实体加几十个常见命名实体(&amp; &nbsp; &mdash; 这一批),认不出的原样保留并统计数量,留在透传 HTML 里的实体写法不动。转义刻意保守:词中间的 a_b_c 不写成带反斜杠的形式,只有行首的 # - + > 与「数字点空格」、成对的 ~ 、会触发语法的 * ` [ ] 才处理,< 与 & 写成实体。标签没闭合或多出结束标签不抛错,按 p/li/tr/td 等隐含结束规则就近补齐。

对应功能编号 #145无需安装,手机端同样可用按 Ctrl + K 换工具