首页 > 解决方案 > 在 C# 中使用 HtmlAgilityPack 解析站点

问题描述

例如,我有链接https://shikimori.one/animes/38256-magia-record-mahou-shoujo-madoka-magica-gaiden-tv/art

我想从那里使用 C# 中的 HtmlAgilityPack 按名称“容器包装”获取 div 类列表。(为了从所有链接下载图像)但这部分

var httpClient = new HttpClient();
var html = await httpClient.GetStringAsync(link);

var htmlDocument = new HtmlDocument();
    htmlDocument.LoadHtml(link);

据我了解,从此页面https://shikimori.one/animes/38256-magia-record-mahou-shoujo-madoka-magica-gaiden-tv向我返回 html 代码。所以,我无法解析“/art”中的任何内容。那是因为下一部分代码只返回 null。

var links = htmlDocument.DocumentNode.Descendants("div")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("menu-slide-outer x199")).ToList();

我错过了什么?

最终代码:

class Program
{

    static List<string> sources = new List<string>();

    [STAThread]
    static void Main(string[] args)
    {

        var link = "https://shikimori.one/animes/1577-taiho-shichau-zo/art";

        var web = new HtmlWeb();
        web.BrowserTimeout = TimeSpan.FromTicks(0);
        var htmlDocument = web.LoadFromBrowser(link);

        var divlink = htmlDocument.DocumentNode.Descendants("div")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("container packery")).ToList();

        var alink = htmlDocument.DocumentNode.Descendants("a")
            .Where(node => node.GetAttributeValue("class", "")
            .Equals("b-image")).ToList();

        foreach(var a in alink)
        {
            sources.Add(a.GetAttributeValue("href", string.Empty));
        }

        Console.WriteLine("done");
        Console.ReadKey();

    }

标签: c#htmlhtml-agility-pack

解决方案


HttpClient

        string html = string.Empty;

        using (var httpClient = new HttpClient())
        {
            html = await httpClient.GetStringAsync(link);
        }

        var htmlDocument = new HtmlDocument();
        htmlDocument.LoadHtml(html); // LoadHtml expects the page source, not the URL.

或者,一种从 URL 解析 HTML 代码的简单方法:

        var web = new HtmlAgilityPack.HtmlWeb();
        var htmlDocument = await web.LoadFromWebAsync(link);

或者,加载动态(即 Ajax)内容:

        var web = new HtmlAgilityPack.HtmlWeb();
        var htmlDocument = web.LoadFromBrowser(link);

推荐阅读