Ottieni la pagina Web utilizzando HtmlAgilityPack.NETCore

.net-core c# html-agility-pack

Domanda

Ho usato HtmlAgilityPack per lavorare con pagine html. In precedenza ho fatto questo:

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

ma ora ho bisogno di usare HtmlAgilityPack.NETCore dove HtmlWeb è assente. Cosa dovrei usare invece HtmlWeb per avere lo stesso risultato?

Risposta accettata

Utilizzare HttpClient come un nuovo modo per interagire con risorse remote tramite http.

Per quanto riguarda la soluzione, è probabilmente necessario utilizzare qui i metodi async per non bloccare il thread, anziché l'utilizzo .Result . Si noti inoltre che HttpClient doveva essere utilizzato da diversi thread a partire da .Net 4.5, quindi non è necessario ricrearlo ogni volta:

// 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....
    }
}

Ottimo articolo su async / attendi: Async / Attendi: best practice nella programmazione asincrona di @StephenCleary | Marzo 2013


Risposta popolare

Ho avuto lo stesso problema nel codice di Visual Studio con netcoreapp1.0. Finito invece con HtmlAgilityPack versione 1.5.0-beta5.

remenber:

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

L'ho fatto in questo modo:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché