html2markdown将单独标签转为单反引号行内代码(如fmt.Println()),若嵌套在中则识别为组合,输出围栏式代码块(如go…)。

html2markdown 如何处理 <code> 标签
默认情况下,html2markdown 会把 HTML 中的 <code> 标签转为 Markdown 的单反引号行内代码,比如 <code>fmt.Println() → `fmt.Println()`。它不依赖上下文判断是否该保留原样,只要标签存在且内容非空,就触发转换。
但要注意:如果 <code> 嵌套在 <pre class="brush:php;toolbar:false;"></code> 内(即代码块场景),<code>html2markdown</code> 会优先按 <code><pre class="brush:php;toolbar:false;"><code></code> 组合识别,并输出围栏式代码块(<code>```go</code>…<code>```</code>),而非连续多个单反引号。</p><ul><li>单独 <code><code></code> → <code>`...`</code></li><li><code><pre class="brush:php;toolbar:false;"><code class="js">...</code></pre> →
...
<code> 内含换行符(HTML 允许但不符合规范),部分版本会截断或报错,建议预处理清理
用 converter.WithPreserveInlineCode 控制是否转义特殊字符
当 HTML 中的 <code> 内容本身含 Markdown 特殊符号(如 *、_、[),默认转换可能意外触发强调或链接解析。例如:<code>list[i] = true 可能被转成 `list[i] = true`,但若后续渲染器对 [i] 做了误解析,显示就可能出错。
Go 库提供 converter.WithPreserveInlineCode 选项,启用后会对行内代码内容做最小化转义(仅处理反引号冲突),避免干扰:
立即学习“前端免费学习笔记(深入)”;
markdown, err := htmltomarkdown.ConvertString(
`<code>if x > 0 && y <= 10 {</code>`,
converter.WithPreserveInlineCode(),
)输出为:`if x > 0 && y —— 保留原始 HTML 实体,不展开为符号。
为什么 <code> 转换后有时丢失语言标识
HTML 中常带 class="python" 或 data-language="ts" 来标注代码语言,但 html2markdown 默认只认 <pre class="brush:php;toolbar:false;"><code class="xxx"></code> 这种组合。单独的 <code><code class="sh"></code> 不会被识别为代码块,也不会带语言标识到 Markdown 围栏中。</code></pre>
解决方法只有两个:
- 确保源 HTML 使用标准的
<pre class="brush:php;toolbar:false;"><code class="xxx"></code> 结构(推荐)</pre> - 用自定义插件提取
<code>的class属性并注入到围栏语法中(需改写handle_starttag逻辑)
命令行工具 html2markdown 不支持该插件机制,必须用 Go 库调用方式才可扩展。
对比 html2text 对 <code> 的处理差异
html2text(Python 实现)默认把所有 <code> 当作普通文本处理,不加反引号,除非显式启用 body_width=0 和 ignore_links=False 等组合配置。它更保守,适合纯内容摘要场景;而 html2markdown 更激进,默认启用语义转换。
关键区别:
-
html2text:默认输出fmt.Println()(无包裹) -
html2markdown:默认输出`fmt.Println()`(自动包裹) - 若 HTML 同时含
<code>和<tt></tt>,html2text可能统一忽略,html2markdown只处理<code>
选哪个,取决于你是否需要“所见即所得”的轻量输出,还是严格遵循 Markdown 语法规范的可编辑结果。



















