You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++技术问询:如何从网站HTML提取多URL存入std::vector?

没问题,我来给你捋清楚怎么实现这个需求!

从HTML字符串中批量提取URL到std::vectorstd::string

要完成这个任务,你可以借助C++标准库的<regex>组件,结合迭代器来批量捕获所有匹配的URL,下面是具体的步骤和代码示例:

一、核心思路

  • 先编写适配HTML场景的URL正则表达式:考虑到HTML里的URL大多出现在href、src这类属性中,也可能是纯文本形式的链接,我们先从最常见的HTTP/HTTPS链接入手。
  • 用std::sregex_iterator遍历整个HTML字符串,自动找出所有符合规则的匹配项。
  • 将每个匹配到的URL提取出来,存入std::vector<std::string>。

二、具体代码实现

#include <iostream>
#include <string>
#include <vector>
#include <regex>

std::vector<std::string> extractUrlsFromHtml(const std::string& htmlContent) {
    std::vector<std::string> urls;
    
    // 正则表达式:匹配HTTP/HTTPS开头的URL,兼顾属性中的引号包裹和纯文本情况
    // 解释:https?:// 匹配http或https协议;[^"\s>]+ 匹配直到引号、空格或标签结束符的内容
    std::regex urlRegex(R"(https?://[^"\s>]+)");
    
    // 使用sregex_iterator遍历所有匹配结果
    std::sregex_iterator it(htmlContent.begin(), htmlContent.end(), urlRegex);
    std::sregex_iterator end; // 迭代器结束标记
    
    // 遍历迭代器,提取每个匹配的URL
    for (; it != end; ++it) {
        urls.push_back((*it).str());
    }
    
    return urls;
}

// 测试示例
int main() {
    std::string html = R"(
        <a href="https://example.com">Example</a>
        <img src="https://example.com/image.jpg" alt="pic">
        纯文本链接:https://another-site.org/page.html
    )";
    
    std::vector<std::string> urls = extractUrlsFromHtml(html);
    
    // 输出结果
    std::cout << "提取到的URL:\n";
    for (const auto& url : urls) {
        std::cout << "- " << url << "\n";
    }
    
    return 0;
}

三、关键细节说明

  • 正则表达式的灵活调整:如果你需要精准提取href属性里的URL(而非所有链接),可以改用这个正则:R"(href\s*=\s*["'](https?://[^"']+)["'])",此时要通过(*it)[1].str()获取捕获组里的核心URL(括号包裹的部分才是我们需要的内容)。
  • 迭代器的作用:std::sregex_iterator会自动遍历整个字符串,每次迭代指向一个匹配结果,直到碰到结束迭代器,不用手动循环查找。
  • 正则的局限性:正则对复杂HTML的支持有限(比如嵌套标签、不规范的属性写法),如果你的HTML结构非常复杂,建议使用专业的HTML解析库,比如Gumbo Parser或者Boost.PropertyTree,它们能更可靠地解析DOM结构并提取URL。

四、扩展优化

如果需要支持更多协议(比如ftp、mailto),可以修改正则开头部分,比如R"((https?|ftp|mailto)://[^"\s>]+)"。

内容的提问来源于stack exchange,提问作者jdoe1010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:32:42