应避免用正则匹配 标签,因其无法可靠处理大小写、换行、引号变体、实体及注释等真实 html 变体;优先选用 htmlcxx(轻量易集成)或 gumbo(严格 html5 兼容),并注意编译配置与内存管理。

别用正则匹配 <a></a> 标签
正则提取链接或标题在真实 HTML 中几乎必然出错。比如 <a href="x"></a> 大写、<a></a> 换行、<a href="x"></a> 单引号、<a href="x"></a> 无引号、 实体、注释里藏 <a> —— <code>std::regex 无法可靠覆盖这些变体,尤其 GCC 9.4 前版本对 UTF-8 中文域名还可能截断。
实际项目中只要 HTML 来源不可控(比如爬虫抓取),用正则就等于默认接受漏链、崩溃、乱码三连击。
优先选 htmlcxx:轻量、头文件为主、不依赖 Boost
htmlcxx 是目前最易集成的 C++ 原生 HTML 解析器。它不验证语法,但能正确 tokenize 常见 HTML5 标签(<nav></nav>、<section></section> 等),属性以 htmlcxx::HTMLNode::AttributeList 形式暴露,可安全遍历。
- 编译时注意运行库匹配:若主项目用
/MDd,htmlcxx也必须设为多线程调试 DLL,否则链接失败 - Windows 下需手动修复
utils.cc第 17 行隐藏换行符(双引号内不能换行) - Linux 下没现成
Makefile,得自己写;Ubuntu 用户可用sudo apt-get install htmlcxx直接装头文件和库 - 解析后节点名统一转小写,判断
node.tagName() == "a",不是"A"或"link"
需要严格 HTML5 兼容?上 Gumbo
Gumbo 是纯 C99 实现,零外部依赖,严格遵循 HTML5 规范,适合处理 malformed HTML(如缺失闭合标签、自闭合 <img>)。但它没有 C++ 封装,需手动管理内存和遍历 DOM。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
关键点:
- 必须用
gumbo_parse_with_options(),且传入HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING,否则遇到常见错误直接返回null - 获取
href要调用gumbo_get_attribute(&node->v.element.attributes, "href"),不是直接查字段 -
GumboOutput*需配对调用gumbo_destroy_output(),否则内存泄漏 - 节点类型判断用
node->type == GUMBO_NODE_ELEMENT,再看node->v.element.tag == GUMBO_TAG_A
避开明显踩坑的库
tinyxml2 不是 HTML 解析器——它只认 well-formed XML,遇到 <br> 不闭合或 <meta charset="utf-8"> 就报错退出;leptonica 是图像库,名字带 tic 纯属巧合;libxml2 可用但要切 HTML 模式:htmlReadMemory() + 上述三个 parse flag,用 xmlReadMemory() 会失败。
真正动手前,先确认你面对的是“能跑通的 demo HTML”还是“线上爬回来的脏数据”——后者几乎一定会暴露解析器的边界能力,而边界往往不在文档里,在 issue 和 commit log 里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










