您的位置:首页 > 财经 > 产业 > 在线3d设计家官网_网站编程员工资_国外推广网站_新闻头条最新消息今天发布

在线3d设计家官网_网站编程员工资_国外推广网站_新闻头条最新消息今天发布

2025/3/18 10:08:42 来源:https://blog.csdn.net/CoderZzz6310/article/details/145653544  浏览:    关键词:在线3d设计家官网_网站编程员工资_国外推广网站_新闻头条最新消息今天发布
在线3d设计家官网_网站编程员工资_国外推广网站_新闻头条最新消息今天发布
解析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;//解析指定的文件,提取titleif(!ParseTitle(result, &doc.title)){continue;}//解析指定的文件,提取content,就是去标签if(!ParseContent(result, &doc.content)){continue;}//解析指定的文件路径,构建urlif(!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;//解析指定的文件,提取titleif(!ParseTitle(result, &doc.title)){continue;}//解析指定的文件,提取content,就是去标签if(!ParseContent(result, &doc.content)){continue;}//解析指定的文件路径,构建urlif(!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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com