文件遍历与筛选
在开始处理数据前,我们需要利用 Boost.Filesystem 模块高效地遍历目录。这里先对命名空间取个别名,简化后续调用。将传入的源路径赋值给根路径变量后,首先校验路径是否存在,若无效则直接返回。
接着通过递归迭代器访问目录下的每一个文件。逻辑上我们主要关注两点:一是确认是否为普通文件,二是检查扩展名是否包含 .html。只有同时满足这两个条件的文件才会被加入列表。需要注意的是,路径对象转换为字符串时,必须使用 .string() 成员函数,而非 to_string(),后者仅适用于数值类型转换。
bool EnumFile(const std::string &src_path, std::vector<std::string> *file_list) {
namespace fs = boost::filesystem;
fs::path root_path(src_path);
if (!fs::exists(root_path)) {
std::cout << src_path << " is not exist" << std::endl;
return true; // 修正:成功返回 true
}
fs::recursive_directory_iterator end;
for (fs::recursive_directory_iterator iter(root_path); iter != end; ++iter) {
// 判断是否为普通文件
if (!fs::is_regular_file(*iter)) continue;
// 过滤非 .html 文件
if (iter->path().extension() != ".html") continue;
file_list->push_back(iter->path().string());
}
return true; // 修正:成功返回 true
}
HTML 解析与数据提取
为了保持代码清晰,我们将读取、标题提取、内容提取和 URL 构建拆分为独立函数。这种模块化设计有助于快速定位错误。
1. 主解析流程
主函数负责协调各个子步骤。依次读取文件内容、提取标题、提取正文并构建 URL,最后将完整的文档信息存入结果集。


