【问题标题】:Get web page using HtmlAgilityPack.NETCore使用 HtmlAgilityPack.NETCore 获取网页
【发布时间】:2017-04-12 08:56:47
【问题描述】:

我使用HtmlAgilityPack 处理html 页面。 以前我是这样做的:

HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(url);
var nodes = document.DocumentNode.SelectNodes("necessary node");

但现在我需要使用没有 HtmlWeb 的 HtmlAgilityPack.NETCore。 我应该用什么来代替HtmlWeb 来获得相同的结果?

【问题讨论】:

    标签: c# .net-core html-agility-pack


    【解决方案1】:

    使用HttpClient 作为通过http 与远程资源交互的新方式。

    至于您的解决方案,您可能需要在此处使用async 方法来非阻塞您的线程,而不是使用.Result。另请注意,HttpClient was meant to be used from different threads 从 .Net 4.5 开始,因此您不应每次都重新创建它:

    // instance or static variable
    HttpClient client = new HttpClient();
    
    // get answer in non-blocking way
    using (var response = await client.GetAsync(url))
    {
        using (var content = response.Content)
        {
            // read answer in non-blocking way
            var result = await content.ReadAsStringAsync();
            var document = new HtmlDocument();
            document.LoadHtml(result);
            var nodes = document.DocumentNode.SelectNodes("Your nodes");
            //Some work with page....
        }
    }
    

    关于 async/await 的精彩文章:Async/Await - Best Practices in Asynchronous Programming @StephenCleary | 2013 年 3 月

    【讨论】:

      【解决方案2】:

      我在使用 netcoreapp1.0 的 Visual Studio 代码中遇到了同样的问题。 最终改用 HtmlAgilityPack 版本 1.5.0-beta5。

      记得添加:

      using HtmlAgilityPack;
      using System.Net.Http;
      using System.IO;
      

      我是这样做的:

      HttpClient hc = new HttpClient(); 
      HttpResponseMessage result = await hc.GetAsync($"http://somewebsite.com"); 
      Stream stream = await result.Content.ReadAsStreamAsync(); 
      HtmlDocument doc = new HtmlDocument(); 
      doc.Load(stream); 
      HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='whateverclassyouarelookingfor']");
      

      【讨论】:

        【解决方案3】:

        我写了这个,它正在工作。这是解决我问题的好方法吗?

        using (HttpClient client = new HttpClient())
        {
            using (HttpResponseMessage response = client.GetAsync(url).Result)
            {
                using (HttpContent content = response.Content)
                {
                    string result = content.ReadAsStringAsync().Result;
                    HtmlDocument document = new HtmlDocument();
                    document.LoadHtml(result);
                    var nodes = document.DocumentNode.SelectNodes("Your nodes");
                    //Some work with page....
                }
            }
        }
        

        【讨论】:

        • 这对我来说很有趣。为什么我们不能使用 await :client.GetAsync(url)
        【解决方案4】:

        可以使用HttpClient获取页面内容。

        【讨论】:

        • 我正在寻找它,但找不到。你能告诉我如何使用它吗?
        • 你的意思是这样的吗? WebClient client = new WebClient(); client.DownloadFile(url, path); 我想在不保存的情况下使用文件。
        猜你喜欢
        • 1970-01-01
        • 2016-10-06
        • 2016-06-02
        • 2018-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多