4.完成html文件读取|获取title|获取content|构建url|调试(C++)

HTML head标签详解:网页启动配置与SEO基础 HTML head是网页的元信息中枢,决定页面编码解析、响应式行为、搜索引擎识别与无障碍访问等核心能力。其本质是一份浏览器启动时优先执行的配置契约,涉及文档类型声明、语言标识、字符编码、视口设置、标题与描述等关键机制。正确配置不仅解决中文乱码、移动端缩放异常、微信分享卡片空白等高频问题,更是SEO优化、跨平台兼容和可访问性的技术前提。本文围绕<head>的7个必备元素展开,结合W3C规范、真实项目排错案例及生产环境最佳实践,系统解析每一行代码背后的浏览器动作与工程影响。 阅读详情
解析html代码结构编写
  1. 建立一个util.hpp,是一个工具集,把所有的工具内容写到这里
touch util.hpp

![[Pasted image 20250215140053.png]]

  1. 编写util.hpp
#include <iostream>
#include <string>
#include <fstream>

namespace ns_util{
	class FileUtil{
		public:
			static bool ReadFile(const std::string &file_path, std::string *out)
			{
				return true;
			}
	};
}   

提取title
![[Pasted image 20250215141021.png]]

提取content,本质是进行去标签
3. 编写parser.cc第二步的代码结构

static bool ParseTiltle(const std::string &file, std::string *title)
{
	return true;
}

static bool ParseContent(const std::string &file, std::string *content)
{
	return true;
}

static bool ParseUrl()
{
	return true;
}

bool ParseHtml(const std::vector<std::string> &files_list, std::vector<DocInfo_t> *results)
{
	for(const std::string &file : files_list){
		//读取文件,Read();
		std::string result;
		if(!ns_util::FileUtil::ReadFile(file, &result)){
			continue;
		}
		DocInfo_t doc;
		//解析指定的文件,提取title
		if(!ParseTitle(result, &doc.title)){
			continue;
		}
		//解析指定的文件,提取content,就是去标签
		if(!ParseContent(result, &doc.content)){
			continue;
		}
		//解析指定的文件路径,构建url
		if(!ParseUrl()){
			continue;
		}

		//done,一定是完成了解析任务,当前文档的所有的相关结果都保存在了doc里面
		results->push_back(doc); 
		//bug:todo;细节,本质会发生拷贝,效率可能会比较低
	}
	return true;
}
编写文件读取代码
  1. 编写util文件
#include <iostream>
#include <string>
#include <fstream>

namespace ns_util{
	class FileUtil{
		public:
			static bool ReadFile(const std::string &file_path, std::string *out)
			{
				std::ifstream in(file_path, std::ios::in);
				if(!in.is_open()){
					std::cerr << "open file" << file_path << " error" << std::endl;
					return false;
				}

				std::string line;
				while(std::getline(in, line)){ //如何理解getline读取到文件结束:getline的返回值是一个&,while判断的是一个bool类型,本质是因为返回的对象当中重载了强制类型转化
					*out += line;
				}

				in.close();
				return true;
			}
	};
}
编写获取title代码

在整个文档里面去搜索title关键字和/title关键字
![[Pasted image 20250215152947.png]]

找到title关键字的开始位置,和/title关键字的开始位置
让头位置+上title的大小,就是有效区的起始,后面的查找到的位置,这是一个前闭后开的区间

static bool ParseTitle(const std::string &file, std::string *title)
{
	std::size_t begin = file.find("<title>");
	if(begin == std::string::npos){
		return false;
	}
	std::size_t end = file.find("</title>");
	if(end == std::string::npos){
		return false;
	}
	begin += std::string("<title>").size();
	
	if(begin > end){
		return false;
	}

	*title = file.substr(begin, end - begin);
	return true;
}
获取文档的content内容

在进行遍历的时候,只要碰到了>右标签,就意味着当前的标签被处理完毕
只要碰到了<左标签,就意味着新的标签开始了

static bool ParseContent(const std::string &file, std::string *content)
{
	//去标签,基于一个简易的状态机
	enum status{
		LABLE,
		CONTENT
	};

	enum status s = LABLE;
	for(char c : file){
		switch(s){
			case LABLE:
				if(c == '>')
					s = CONTENT;
				break;
			case CONTENT:
				if(c == '<')
					s = LABLE;
				else{
					//不想保留原始文件中的\n,因为想用\n作为html解析之后文本的分隔符
					if(c == '\n')
							c = ' ';
					content->push_back(c);
				}
				break;
			default:
				break;
		}
	}
	return true;
}
编写构建url代码

boost库的官方文档,和下载下来的文档是有路径的对应关系的

官⽹URL样例:
https://www.boost.org/doc/libs/1_78_0/doc/html/accumulators.html  

我们下载下来的url样例:
boost_1_78_0/doc/html/accumulators.html  

我们拷⻉到我们项⽬中的样例:
data/input/accumulators.html 
//我们把下载下来的boost库  doc/html/* copy data/input/

url_head = "https://www.boost.org/doc/libs/1_78_0/doc/html";  
url_tail = [data/input](删除) /accumulators.html -> url_tail =  /accumulators.html  
url = url_head + url_tail ; 相当于形成了⼀个官⽹链接

编写parser.cc

static bool ParseUrl(const std::string &file_path, std::string *url)
{
	std::string url_head = "https://www.boost.org/doc/libs/1_87_0/doc/html";
	std::string url_tail = file_path.substr(src_path.size());
	
	*url = url_head + url_tail;
	return true;
}

bool ParseHtml(const std::vector<std::string> &files_list, std::vector<DocInfo_t> *results)
{
	for(const std::string &file : files_list){
		//读取文件,Read();
		std::string result;
		if(!ns_util::FileUtil::ReadFile(file, &result)){
			continue;
		}
		DocInfo_t doc;
		//解析指定的文件,提取title
		if(!ParseTitle(result, &doc.title)){
			continue;
		}
		//解析指定的文件,提取content,就是去标签
		if(!ParseContent(result, &doc.content)){
			continue;
		}
		//解析指定的文件路径,构建url
		if(!ParseUrl(file, &doc.url)){
			continue;
		}
		//done,一定是完成了解析任务,当前文档的所有的相关结果都保存在了doc里面
		results->push_back(doc); //bug:todo;细节,本质会发生拷贝,效率可能会比较低
	}
	return true;
}
调试
void ShowDoc(const DocInfo_t &doc)
{
	std::cout << "title: " << doc.title << std::endl;
	std::cout << "content: " << doc.content << std::endl;
	std::cout << "url: " << doc.url << std::endl;
}

make链接,运行文件
![[Pasted image 20250215171014.png]]

Chapter 46. Boost.YAP - 1.87.0
![[Pasted image 20250215171623.png]]

成功获取到官方url

Python网络爬虫实战:从零构建小说下载工具 网络爬虫是一种自动化抓取互联网公开信息的程序,其核心原理是通过模拟浏览器请求获取网页数据,并利用HTML解析技术提取目标内容。这项技术对于数据采集、信息聚合和自动化处理具有重要价值,广泛应用于市场分析、舆情监控和学术研究等领域。在Python生态中,requests库负责处理网络请求,而BeautifulSoup则用于解析HTML结构,两者结合能高效实现网页内容的定位与提取。通过构建一个小说下载工具,开发者可以深入理解爬虫的工作流程,包括请求伪装、异常重试、数据清洗和本地化存储等关键环节。本项目以实战为导向 阅读详情

相关推荐

五分钟实战:用AI辅助编写C语言网络爬虫

网络爬虫是自动获取网页数据的关键技术,其核心原理是通过HTTP协议与服务器通信,解析返回的HTML文档以提取结构化信息。在工程实践中,Python凭借requests、BeautifulSoup等库成为主流选择,但使用C语言手动实现能深入理解套接字编程、内存管理和协议解析等底层机制,对夯实系统编程基础极具价值。随着AI编程助手的普及,开发者可以借助其快速生成代码框架,再聚焦于错误处理、内存安全等关键细节的迭代优化。本文以DeepSeek为协作伙伴,演示了从需求描述、代码生成到功能增强的完整流程,为探索AI辅

chuannaoxuan4674的博客 344

C++ 解析html

经过实测发现对于html解析不友好,例如无法解析",以及部分网页解析出错。

CAir2的专栏 1530

Opus4.7+GLM5构建本地Claude兼容对话系统

对话操作系统(Conversational OS)是一种将大模型交互逻辑与底层推理引擎解耦的中间件架构,其核心原理是通过协议适配、请求重写与响应标准化,实现OpenAI兼容接口与国产大模型(如GLM5)的无缝对接。该技术显著提升AI应用的自主可控性与网络鲁棒性,广泛应用于代码审查、文档生成、IDE智能插件等需低延迟、高隐私、强稳定性的工程场景。本文聚焦Opus4.7作为轻量级HTTP路由引擎,如何协同GLM5完成上下文管理、流式响应、工具调用等关键能力的本地化落地。

weixin_30756499的博客 1338

cpp 解析HTML之 htmlcxx

c++解析html

Mr.Sugarcane 972

ASP.NET MVC3静态化:IIS URL重写绕过路由方案

静态页面是提升Web性能的基础手段,其核心原理在于跳过动态请求处理管道,由Web服务器直接返回磁盘文件。在ASP.NET生态中,MVC3默认将所有无扩展名请求交由Routing模块处理,导致即使存在同名HTML文件也无法被IIS StaticFileModule识别。要实现真正的零延迟响应,关键在于利用IIS URL Rewrite Module在ASP.NET管道介入前完成路径匹配与内部重写,结合物理文件存在性检查(IsFile)和路径规范化映射,使`/about`等语义化URL无缝指向`/static/

clugcpne10995的博客 451

Django模板与静态文件协同机制深度解析

Django的模板系统负责服务端动态渲染,静态文件则由Web服务器直接提供,二者构成前后端资源协同的基础架构。其核心原理在于分离‘渲染时路径解析’与‘服务时物理映射’:模板通过TEMPLATES配置和继承机制组织HTML结构,静态文件依赖STATICFILES_DIRS、STATIC_ROOT与STATIC_URL三级寻址体系,并经collectstatic构建后交由Nginx等服务器托管。该机制保障了多应用复用、CDN对接与缓存控制等关键工程能力,在前后端分离、Docker部署及Django 4.2+生产

diandingyin9417的博客 556

html 获取title值,分享两种获取WEB标题title的方法

如何获取HTML页面的标题?下面本篇文章就来给大家介绍一下使用javascript获取HTML文档标题的方法,希望对大家有所帮助。方法一:使用title属性title 属性可返回当前文档的标题( HTML title 元素中的文本)。语法:document.title示例:使用document.title属性获取HTML文档的标题。html>MytitleHTML文件的标题为:docume...

weixin_36205072的博客 3656

Java+HTML5构建绿色环保网站:从架构设计到部署实战

Web开发的核心在于理解前后端如何协同工作,构建动态、可交互的应用。其基本原理通常遵循客户端-服务器模型,前端负责用户界面与交互,后端处理业务逻辑与数据存储。在技术选型上,Java凭借其成熟的生态、跨平台特性和稳健的JVM,成为构建可靠后端服务的经典选择。而HTML5作为现代前端开发的基石,不仅通过语义化标签提升页面结构清晰度,其原生的多媒体支持、Canvas绘图及本地存储能力,更是为创建丰富交互体验提供了强大支撑。结合响应式设计,可以确保网站在多端设备上完美呈现。这种经典的技术组合,其技术价值在于高可维护

weixin_34310369的博客 710

python编程获取网页标题title的几种方法及效果对比(源代码)

由于HttpRead是用MASM32编写的,要作相应的修改不是一下子就能搞定的,于是拿现在流行的Python来试了一下。研究了一下,发现从网页的标题(Title)就可以判断是否包含某某人的信息,也就是只要读取网页的标题(Title),就可以进行筛选了。用之前写的HttpRead(简介和下载地址在本文末属)将这些网页url内容读取出来,再做关键字搜索可以完成,但是效率有点低。#['\r\n\t续蜀山剑侠传最新章节首家独发-风叶如笛-武侠仙侠-梦溪文学网\r\n'].........

Purpleendurer@优快云 5877

C++读取html内容

C++读取html内容,支持HTTPS,只包含cpp,h文件,可以应用到任何C++项目经理

自己用c++写的html文件解析程序(html-x)

程序已经更新,具体代码见: http://blog.csdn.net/sx1989827/archive/2010/02/01/5275624.aspx

MinerU 输出文件全解:layout/span 可视化调试与 model/middle/content_list 结构化输出的字段详解

`mineru` 命令在完成一次文档解析后,除最终 Markdown 外还会输出一整套用于调试、质检与二次开发的辅助文件:`*_layout.pdf`、`*_span.pdf`、`*_model.json`、`*_middle.json`、`*_content_list.json` 与 `*_content_list_v2.json`。本篇基于官方输出文件说明文档,逐一拆解每类文件的命名规则、字段

gitblog_00227的博客 632

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 330

MinerU 输出文件全解:layout.pdf、middle.json、content_list_v2.json 的生成逻辑与结构详解

本文围绕 MinerU 的官方输出文件文档展开,系统讲解执行 `mineru` 命令后各辅助文件(可视化调试文件与结构化数据文件)的命名规则、字段含义与适用场景,并结合仓库源码说明这些文件是如何从 `middle.json` 一步步渲染生成的,帮助你在调试解析质量、做二次开发或对接 Agent 工作流时快速选对文件、读懂每个字段。 [![MinerU layout.pdf 布局分析可视化示例](

gitblog_00431的博客 818

OCTF2016--piapiapia

知识点: php反序列化长度变化尾部字符串逃逸 目录扫描发现www.zip,下载得到源码 源码有index.php,输入账号密码后会进入profile.php,还有register.php、updata.php、class.php和config.php flag值在config.php中,想办法访问到其内容 通过seay代码审计找到一点线索 看到profile.php中存在任意文件读取漏洞,前面还有反序列化 现在我们有个大体思路了,update.php中有一个$prof..

Oavinci的博客 473

DAC8568 Controller

DAC8568 ControllerDAC8568 简介串行接口三级目录 DAC8568 简介 PIN Description Name Description LDAC‾\overline{LDAC}LDAC load DACs SYNC‾\overline{SYNC}SYNC 低电平有效,电平触发控制, 该输入为输入数据的帧同步信号. 当SYNC为低,使能DAC内输入移位寄存器,并在随后的所有时钟沿采样数据。 在第32个时钟之后,DAC更新输出。 若不到32个时钟SYNC被置高(即

u010170039的博客 5129

Macro 已保存视图(Saved Views)架构解析:通用定义存储与 Tasks 首个消费端实践

Saved Views 是 Macro 中可复用的命名视图定义,它只保存"过滤条件 + 布局 + 分组 + 排序"这类**定义**,绝不保存结果快照。本文以 `apps/web/src/features/saved-views/CLAUDE.md` 为主线,逐层拆解这个通用特性的类型契约、读写 hooks、对话框生命周期与组件边界,并结合 `tasks-view` 的版本化 codec 与后端 `

gitblog_00199的博客 388

104基于深度学习识别是AI生成还是真实图片

的可视化界面,通过点击左侧可以加载要识别的检测对象图片,点击中间的识别按钮,会识别出结果,识别结果在右侧显示,当前识别的图片是真实的图片,非假图片。有兴趣的小伙伴也可以自行扩充数据集,或训练自己的数据集。文本,分别存放了图片路径和对应的标签。文本里面的数据,并将训练好的模型也保存在本地。即可加载训练好的模型,真假图片进行识别。本期给大家介绍的是基于深度学习识别是。代码整体是非常简便的,总共三个。个文件夹分别是真图和。

xcvxvfgdfgfh的博客 2260

Glance 扩展机制详解:用一个 HTTP 请求和几个特殊响应头打造自己的第三方 Widget

Glance 的扩展(Extension)功能允许你把自己部署的任何 HTTP 服务接入仪表盘,只需在响应中携带几个约定的 `Widget-*` 头,Glance 就会把返回内容渲染成一个标准 widget。本文基于 [docs/extensions.md](https://link.gitcode.com/i/6fc3948c16bab4731301284e4673a1d4) 和 [docs/c

gitblog_00941的博客 284

34、木材在家具制造中的应用

本文详细探讨了木材在家具制造中的应用,从木材的选择、加工技术到设计创新和表面处理等方面进行了全面解析,并结合实际案例分析木材家具的市场趋势与未来发展。文章强调了木材家具在功能性、智能化和环保性方面的潜力,展示了其在现代家居生活中的重要地位。

flink9streamer的博客 242

6、业务影响分析(BIA)的数据收集与关键指标评估

本文全面解析了业务影响分析(BIA)的核心内容,包括数据收集、业务流程分析、信息系统与资产清单、人员与供应商依赖、影响声明、关键指标评估(如MTD、RTO、RPO)、威胁建模与风险分析等。通过详细的介绍和图表展示,帮助组织系统性地制定灾难恢复计划,以应对各种潜在风险,确保关键业务流程在灾难发生后能够快速恢复并持续运营。

moss5的博客 374

Node.js原生模块实战:打造Markdown转HTML的自动化构建工具

Node.js 作为典型的服务端运行时,内置了 fs、path、child_process、crypto、zlib 等模块,为开发者提供了跨平台的文件操作、子进程管理、数据压缩等底层能力。通过组合这些原生能力,可以在不引入重型框架的前提下构建轻量级自动化管线:例如利用 fs 和 path 完成目录遍历与路径规范化,借助 child_process 安全调用外部命令 ffmpeg 对图片和视频进行压缩转码,再用 crypto 计算内容哈希实现增量构建,最终用 zlib 输出 gzip 文件。这种工程思路适用于

weixin_34198762的博客 274

六种光耦综合对比——《器件手册--光耦》

可控硅输出光耦(SCR Optocoupler)是一种特殊的光电耦合器,由红外发光二极管(LED)和双向可控硅(SCR)组成,用于实现输入和输出之间的电气隔离和信号传输。逻辑输出光耦是一种高效、可靠的数字信号隔离和电平转换器件,通过电气隔离和逻辑电平输出,确保了系统的安全性和信号的稳定性。固态继电器(可控硅输出,SSR)是一种无触点电子开关设备,利用可控硅(SCR或Triac)作为主要开关元件,通过光耦合器实现输入和输出之间的电气隔离。光耦作为一种成熟的电气隔离器件,在电子电路设计中具有重要的地位。

XU157303764的博客 1725

Kami 生产构建手册:从 HTML / Python / Markdown 到 PDF、PPTX、DOCX 的完整渲染链路

本篇技术指南以 Kami 仓库的工程运行手册 [skills/kami/references/production.md](https://link.gitcode.com/i/006f303bb6daaed68bcaae270fb43bc6) 为骨架,系统讲解 Kami 的全部交付物渲染路径:从 HTML 源码经 WeasyPrint 出 PDF、从 Python 脚本经 python-pptx

gitblog_00831的博客 777

【Unity优化篇】| Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节

本篇文章来简单介绍一下 Unity中几种常用3D场景优化策略 方法 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧! 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节

努力前行,总会成为自己心中的那道光 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

PocketBase与HTMX:单文件构建全栈Web应用的生产级实践

在现代Web开发中,如何以最小技术栈和运维成本快速构建功能完整的应用,是许多开发者面临的挑战。传统方案通常涉及前后端分离、多服务集成与复杂部署流程,导致开发周期长、维护负担重。BaaS(后端即服务)和渐进式增强等概念为此提供了新思路,通过提供开箱即用的后端基础设施与简化前端交互的技术,能够显著提升开发效率并降低入门门槛。PocketBase作为一款开源BaaS平台,将数据库、API、认证和文件存储等核心后端功能集成于单一可执行文件,实现了极简部署与运维。HTMX则通过扩展HTML属性,使开发者无需编写复杂J

weixin_34245082的博客 418

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: 3.编写parser文件使用boost枚举文件名
下一篇: 5.编写写入文件代码|调试|编写建立索引的模块index的代码结构(C++)
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值