【问题标题】:Parsing site using HtmlAgilityPack in C#在 C# 中使用 HtmlAgilityPack 解析站点
【发布时间】:2020-04-09 20:44:41
【问题描述】:

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

我想在 C# 中使用 HtmlAgilityPack 按名称“container packery”从那里获取 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# html html-agility-pack


    【解决方案1】:

    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);
    

    【讨论】:

    • 谢谢!有没有简单的方法从 URL 解析 html 代码?
    • 谢谢,它正在工作!但是我遇到了一个新问题。当我尝试从名为“l-content”的 div 块中获取所有内容时,结果实际上是所有 div 块到最后。但它缺少包含所有图像链接的类“b-gallery”。我假设客户端在完全加载时根本不会加载整个页面。有没有办法加载整个页面?
    • @Okashi 不完全是,它是一个运行以“加载”内容的脚本,但 HtmlAgilityPack 也可以做到这一点。已更新。
    • 它基本上可以工作。但它的加载内容idk,随机?当我删除 [STAThread] 或评论 web.BrowserTimeout = TimeSpan.FromTicks(0) 时,运行代码时出现错误,将这些内容添加回来,它有时会再次工作。我不明白问题是什么。在问题中添加了最终代码。它只是像以前一样加载,没有完整的内容。
    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多