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

使用HtmlAgilityPack获取HTML时显示“Loading...”的解决方法

这个问题我碰到过好多次啦!你看到的「Loading....」其实是因为HtmlAgilityPack的HtmlWeb只能抓取静态HTML内容,而目标网站的内容是通过JavaScript动态渲染出来的——当HtmlWeb请求页面时,JS还没来得及执行,所以拿到的只是未渲染的初始页面,自然看不到真实数据。

下面给你两个实用的解决方案:

解决方案一:用浏览器自动化工具模拟真实浏览

这类工具会启动真实浏览器,完整执行页面里的JS代码,等页面渲染完成后再抓取HTML,完美解决动态内容的问题。我常用Selenium,给你举个例子:

  1. 先安装NuGet包:Selenium.WebDriver 和 Selenium.WebDriver.ChromeDriver(自动管理Chrome驱动)
  2. 示例代码:
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using HtmlAgilityPack;
using OpenQA.Selenium.Support.UI;

private static void GetDynamicHtml()
{
    // 配置Chrome浏览器,用无头模式不显示窗口
    var options = new ChromeOptions();
    options.AddArgument("--headless=new");
    options.AddArgument("--disable-gpu");

    using (var driver = new ChromeDriver(options))
    {
        string targetUrl = "你的目标网站URL"; // 替换成实际要爬的地址
        driver.Navigate().GoToUrl(targetUrl);

        // 显式等待页面渲染完成(比硬等几秒更可靠)
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        // 等待页面不再显示Loading文本
        wait.Until(d => !d.PageSource.Contains("Loading...."));

        // 获取渲染完成后的完整HTML
        string renderedHtml = driver.PageSource;
        
        // 继续用HtmlAgilityPack解析
        var htmlDoc = new HtmlDocument();
        htmlDoc.LoadHtml(renderedHtml);
        var node = htmlDoc.DocumentNode.SelectSingleNode("//body");
        Console.WriteLine(node.OuterHtml);
    }
}
解决方案二:直接抓取数据API(更高效)

很多网站的动态内容其实是通过AJAX请求后端API获取的,你可以跳过HTML直接抓这个接口,拿到JSON格式的数据,比解析HTML效率高多了:

  1. 打开浏览器开发者工具(F12),切换到「Network」标签
  2. 刷新页面,过滤「XHR」或「Fetch」请求,找到返回你需要数据的API接口
  3. 复制这个API的URL,用HttpClient直接请求

示例代码:

using System.Net.Http;
using System.Text.Json;

private static async Task FetchDataFromApi()
{
    string apiUrl = "你找到的API接口地址"; // 替换成实际API URL
    using var httpClient = new HttpClient();
    
    // 有些接口需要请求头(比如User-Agent、Cookie),可以从开发者工具里复制过来
    httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
    
    var response = await httpClient.GetAsync(apiUrl);
    response.EnsureSuccessStatusCode();
    
    string jsonContent = await response.Content.ReadAsStringAsync();
    // 可以把JSON转换成实体类,方便后续处理
    // var data = JsonSerializer.Deserialize<YourCustomModel>(jsonContent);
    Console.WriteLine(jsonContent);
}

小提醒:用Selenium时要注意驱动版本和浏览器版本匹配;抓API的话,如果遇到请求失败,记得检查是否需要携带Cookie或其他请求头哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:16:26