基于Golang的简易HTML压缩器_去除多余空格与注释

3次阅读

go中用golang.org/x/net/html解析html需注意:跳过注释节点、仅在非预格式化上下文规整文本空格、用html.render输出避免自闭合标签错误、脚本样式内容禁用压缩。

基于Golang的简易HTML压缩器_去除多余空格与注释

Go 里用 golang.org/x/net/html 解析 HTML 容易卡在注释节点

HTML 注释(<!-- ... -->)在 golang.org/x/net/html 中是独立的 html.CommentNode 类型,但默认遍历器不会跳过它——结果就是压缩后注释原样保留,甚至可能因节点顺序错乱导致闭合标签错位。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 遍历 dom 树时,对每个 node.Type == html.CommentNode 的节点直接 continue 或设为 nil
  • 别依赖 node.Data字符串替换,注释内容在 node.Data 里不带 <!---->,手动拼接容易出错
  • 注意 html.Parse 默认不合并相邻文本节点,连续空格或换行可能被拆成多个 html.TextNode,得在遍历中主动合并

strings.TrimSpace 不能直接用于 HTML 文本节点压缩

直接对每个 html.TextNodenode.Data 调用 strings.TrimSpace 会误杀内联样式里的空格、<pre class="brush:php;toolbar:false;"></pre><code> 里的有意义空白,而且无法处理标签间的“间隙空格”(比如 <div> <span> 中的空格)。<p>实操建议:</p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">go语言免费学习笔记(深入)</a>”;</p> <ul> <li>只对非预格式化上下文(即不在 <code><pre class="brush:php;toolbar:false;"></pre><textarea></textarea><script></script><style></style> 内)的文本节点做空格规整

  • 用正则 regexp.MustCompile(`s+`) 替换为单个空格,再 trim 首尾,比 TrimSpace 更可控
  • 标签之间(如
  • text=ZqhQzanResources