C HTML格式解析与生成之gumbo

发布时间:2026/11/2 1:14:04

C HTML格式解析与生成之gumbo 测试#include fstream #include iostream #include stdlib.h #include string #include ../src/gumbo.h // 提取纯文本内容 static std::string cleantext(GumboNode* node) { if (node-type GUMBO_NODE_TEXT) { return std::string(node-v.text.text); } else if (node-type GUMBO_NODE_ELEMENT node-v.element.tag ! GUMBO_TAG_SCRIPT node-v.element.tag ! GUMBO_TAG_STYLE) { std::string contents ; GumboVector* children node-v.element.children; for (unsigned int i 0; i children-length; i) { const std::string text cleantext((GumboNode*) children-data[i]); if (i ! 0 !text.empty()) { contents.append( ); } contents.append(text); } return contents; } else { return ; } } // 提取url链接 static void search_for_links(GumboNode* node) { if (node-type ! GUMBO_NODE_ELEMENT) { return; } GumboAttribute* href; if (node-v.element.tag GUMBO_TAG_A (href gumbo_get_attribute(node-v.element.attributes, href))) { std::cout href-value std::endl; } GumboVector* children node-v.element.children; for (unsigned int i 0; i children-length; i) { search_for_links(static_castGumboNode*(children-data[i])); } } // 查找标题 #include assert.h static const char* find_title(const GumboNode* root) { assert(root-type GUMBO_NODE_ELEMENT); assert(root-v.element.children.length 2); const GumboVector* root_children root-v.element.children; GumboNode* head NULL; for (int i 0; i root_children-length; i) { GumboNode* child (GumboNode*) root_children-data[i]; if (child-type GUMBO_NODE_ELEMENT child-v.element.tag GUMBO_TAG_HEAD) { head child; break; } } assert(head ! NULL); GumboVector* head_children head-v.element.children; for (int i 0; i head_children-length; i) { GumboNode* child (GumboNode*) head_children-data[i]; if (child-type GUMBO_NODE_ELEMENT child-v.element.tag GUMBO_TAG_TITLE) { if (child-v.element.children.length ! 1) { return empty title; } GumboNode* title_text (GumboNode *) child-v.element.children.data[0]; assert(title_text-type GUMBO_NODE_TEXT || title_text-type GUMBO_NODE_WHITESPACE); return title_text-v.text.text; } } return no title found; } static std::string find_line( const std::string original_text, const GumboAttribute attr) { size_t attr_index attr.original_value.data - original_text.data(); size_t begin original_text.rfind(\n, attr_index) 1; size_t end original_text.find(\n, attr_index); if (end ! std::string::npos) { end--; } else { end (size_t) original_text.length() - 1; } end std::min(end, attr_index 40); begin std::max(begin, attr_index - 40); return original_text.substr(begin, end - begin); } // 查找class元素 static void search_for_class( GumboNode* node, const std::string original_text, const char* cls_name) { if (node-type ! GUMBO_NODE_ELEMENT) { return; } GumboAttribute* cls_attr; if ((cls_attr gumbo_get_attribute(node-v.element.attributes, class)) strstr(cls_attr-value, cls_name) ! NULL) { std::cout cls_attr-value_start.line : cls_attr-value_start.column - find_line(original_text, *cls_attr) std::endl; } GumboVector* children node-v.element.children; for (int i 0; i children-length; i) { search_for_class( static_castGumboNode*(children-data[i]), original_text, cls_name); } } int main(int argc, char** argv) { if (argc ! 2) { std::cout Usage: clean_text html filename\n; exit(EXIT_FAILURE); } const char* filename argv[1]; std::ifstream in(filename, std::ios::in | std::ios::binary); if (!in) { std::cout File filename not found!\n; exit(EXIT_FAILURE); } std::string contents; in.seekg(0, std::ios::end); contents.resize(in.tellg()); in.seekg(0, std::ios::beg); in.read(contents[0], contents.size()); in.close(); GumboOutput* output gumbo_parse_with_options( kGumboDefaultOptions, contents.data(), contents.length()); std::cout cleantext(output-root) std::endl; //search_for_links(output-root); //find_title(output-root); //const char* cls article; //search_for_class(output-root, contents, cls); gumbo_destroy_output(kGumboDefaultOptions, output); }效果参考C HTML格式解析与生成-CSDN博客GitHub - google/gumbo-parser: An HTML5 parsing library in pure C99创作不易小小的支持一下吧
延伸阅读

更多相关文章

2026/11/2 1:14:04

C++自动寻径算法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:14:04

VirtualBox Install MacOS

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:14:04

C++ std::any升级为SafeAny

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 4:30:01

从单Agent到多Agent:Codex闭环与A2A协作协议解析

做 Agent 开发这两年,我越来越确认一个判断:单 Agent 是工程问题,多 Agent 是协议问题。从 OpenAI 的 Codex 把 Agent 循环做到产品级,到 Google 牵头把 A2A(Agent2Agent)协议推进 Linux 基金会&#xff0c…

2026/11/2 4:30:01

Spring Initializr快速创建Spring Boot项目的完整指南

1. Spring Initializr项目创建概述Spring Initializr是Spring官方提供的项目初始化工具,它通过简单的Web界面或命令行交互,帮助开发者快速生成Spring Boot项目的基础结构。这个工具解决了项目初始配置繁琐的问题,让开发者能够专注于业务逻辑开…

2026/11/2 4:30:01

iText 7.2.5 PDF实战:创建、签章、水印、文本替换四合一源码包

简介:本资源是一套基于iText 5.x的PDF文档处理Java工程实践源码包,面向Java开发工程师及PDF自动化处理需求者,聚焦创建、电子签章、斜角水印添加与文本内容替换四大高频场景。压缩包共32个文件,含7个核心Java源码、9个编译后class…

2026/11/2 4:30:01

CEC2013测试集使用指南:从C源码编译到Python ctypes调用

简介:本资源为CEC2013国际进化计算基准测试集的完整实现包,面向智能优化、演化算法研究者及高校相关方向研究生,用于系统性评估单目标优化算法在多模态、非线性、高维等复杂问题上的收敛性与鲁棒性。压缩包共32个文件(28个txt输入…

2026/11/2 4:30:01

斐波那契数列求和:递归、迭代与矩阵快速幂实现对比

1. 斐波那契数列基础概念解析斐波那契数列(Fibonacci sequence)是以意大利数学家列昂纳多斐波那契命名的数列,其数学定义为:F(0) 0F(1) 1F(n) F(n-1) F(n-2) (当n≥2时)这个数列的前几项是:…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑