Html Agility Pack 如何在页面加载后获取动态生成的内容

Html Agility Pack how to get dynamically generated content after page loads

我正在尝试从“https://www.sideshow.com/collectibles?manufacturer=Hot+Toys”获取信息 特别是 Div c-ProductList 行 ss-targeted 但似乎没有检索到任何信息,任何线索

var test = page.DocumentNode.SelectNodes("//div[@class='c-ProductList row ss-targeted']");

您要获取的内容是在页面加载后生成的,使用Javascript和Ajax。 HAP 无法获取它,除非它在后台运行浏览器并执行页面上的脚本。

.Net Core 2.0

先决条件:您需要 Chrome 在您的 PC 上安装网络浏览器。

  1. 创建控制台应用程序

  2. 安装 Nuget 包 Install-Package HtmlAgilityPack Install-Package Selenium.WebDriver Install-Package Selenium.Chrome.WebDriver

  3. Main方法替换为以下

代码:

    static void Main(string[] args)
    {
        string url = "https://www.sideshow.com/collectibles?manufacturer=Hot+Toys";
        var browser = new ChromeDriver(Environment.CurrentDirectory);
        browser.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
        browser.Navigate().GoToUrl(url);

        var results = browser.FindElementByClassName("ss-results");
        var doc = new HtmlDocument();
        doc.LoadHtml(results.GetAttribute("innerHTML"));

        // Show results
        var list = doc.DocumentNode.SelectSingleNode("//div[@class='c-ProductList row ss-targeted']");
        foreach (var title in list.SelectNodes(".//h2[@class='c-ProductListItem__title ng-binding']"))
        {
            Console.WriteLine(title.InnerText);
        }
        Console.ReadLine();
    }

.Net 4.6

  1. 创建控制台应用程序

  2. 安装 Nuget 包Install-Package HtmlAgilityPack

  3. Solution Explorer 中添加对 System.Windows.Form

    的引用
  4. 根据需要添加 using 语句

  5. Main方法替换为以下

代码:

[STAThread]
static void Main(string[] args)
{
    string url = "https://www.sideshow.com/collectibles?manufacturer=Hot+Toys";

    var web = new HtmlWeb();
    web.BrowserTimeout = TimeSpan.FromSeconds(30);

    var doc = web.LoadFromBrowser(url, o =>
    {
        var webBrowser = (WebBrowser)o;

        // Wait until the list shows up
        return webBrowser.Document.Body.InnerHtml.Contains("c-ProductList");
    });

    // Show results
    var list = doc.DocumentNode.SelectSingleNode("//div[@class='c-ProductList row ss-targeted']");
    foreach (var title in list.SelectNodes(".//h2[@class='c-ProductListItem__title ng-binding']"))
    {
        Console.WriteLine(title.InnerText);
    }
    Console.ReadLine();
}

显示以以下开头的列表:

Iron Man Mark L

John Wick

The Punisher War Machine Armor

Wonder Woman Deluxe Version