HTML解析引擎不校验语法,而是依HTML Living Standard强制重建DOM:非法标签、未闭合元素、编码错误等均触发静默容错修复,导致源码与实际DOM不一致;W3C Validator是唯一能精准预判此类问题的工具。

HTML解析引擎的容错机制不是“宽容”,而是按标准强制重建DOM——你写的代码和最终生效的结构,可能根本不是一回事。
浏览器不报错,是因为它根本不走“校验”这步
HTML不是编程语言,没有语法编译阶段。lxml.html.fromstring、DOMParser.parseFromString、浏览器内置解析器,拿到的是字节流或字符串,直接进入词法分析 → 生成token → 按HTML Living Standard规则构造DOM树。过程中遇到<div></div>、<p>hello</p>
<div>world</div>、缺失
常见表现:
- 写
<p>第一段</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill6712" title="Wechat HTML Publisher">Wechat HTML Publisher</a> <p>直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <div>第二段</div> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>,实际DOM是<p>第一段</p> <div>第二段</div>(<p></p>被隐式闭合) - 用
document.body.innerHTML取回内容,得到的是修复后的HTML,不是原始源码 - JS里用
el.querySelectorAll('nav > *')匹配失败,因为<nav></nav>没闭合,<footer></footer>被包进去了
编码错误也会静默损坏DOM,但表现更隐蔽
原始HTML是GBK编码,却以UTF-8解码喂给lxml.html.fromstring(),结果不是报错,而是把中文变成或直接截断;gumbo-parser遇到非法UTF-8字节(如0xFF 0xFE)会跳过,但完全不读取<meta charset="gb2312">


















