2017-04-12 349 views
4

我使用HtmlAgilityPack来处理html页面。 以前我这样做:使用HtmlAgilityPack.NETCore获取网页

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

,但现在我需要使用HtmlAgilityPack.NETCore其中HtmlWeb不存在。 我应该用什么来代替HtmlWeb才能得到相同的结果?

回答

4

使用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.... 
    } 
} 

大文章关于异步/ AWAIT:Async/Await - Best Practices in Asynchronous Programming由@StephenCleary | 2013年3月

+0

谢谢,这是一个很好的建议。 – AlexCOM

-1

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

+0

我正在寻找,但找不到。你能告诉我如何使用它? – AlexCOM

+0

你是不是这个意思? 'WebClient client = new WebClient(); client.DownloadFile(url,path);' 我想在不保存的情况下使用文件。 – AlexCOM

1

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

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.... 
     } 
    } 
} 
+0

在答案中加了一些代码 – VMAtm

+0

这对我很有趣。为什么我们不能使用await:client.GetAsync(url) – alerya

3

我在使用netcoreapp1.0的Visual Studio代码中遇到了同样的问题。 代之以使用HtmlAgilityPack版本1.5.0-beta5结束。

Remenber:

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']");