Ich habe das HtmlAgilityPack
für die Arbeit mit HTML-Seiten verwendet. Vorher habe ich das gemacht:
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(url);
var nodes = document.DocumentNode.SelectNodes("necessary node");
aber jetzt muss ich die HtmlAgilityPack.NETCore verwenden, wo HtmlWeb
abwesend ist. Was sollte ich anstelle von HtmlWeb
, um dasselbe Ergebnis zu erhalten?
Verwenden Sie den HttpClient
als neue Möglichkeit zur Interaktion mit Remote-Ressourcen über http.
Was Ihre Lösung .Result
, müssen Sie wahrscheinlich die async
Methoden hier verwenden, um Ihren Thread nicht zu blockieren, anstatt .Result
. Beachten Sie auch, dass HttpClient
aus verschiedenen Threads ab .NET 4.5 verwendet werden sollte. Sie sollten es nicht jedes Mal neu erstellen:
// 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....
}
}
Großer Artikel über async / await: Async / Await - Best Practices in der asynchronen Programmierung von @StephenCleary | März 2013
Ich hatte das gleiche Problem in Visual Studio-Code mit netcoreapp1.0. Endete mit HtmlAgilityPack Version 1.5.0-Beta5 statt.
Denken Sie daran, Folgendes hinzuzufügen:
using HtmlAgilityPack;
using System.Net.Http;
using System.IO;
Ich habe es so gemacht:
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']");