Ho cercato di ottenere dati da una pagina Web in C # utilizzando l'HTML Agility Pack. Sono stato in grado di recuperare i dati da diverse pagine Web, ma su questa pagina Web ricevo una NullReferenceException
e la mia unica ipotesi è che abbia qualcosa a che fare con XPath.
Ecco il mio codice, cercando di raggiungere il testo "Limbo Wand"
string url = "https://www.dofus.com/en/mmorpg/encyclopedia/weapons/180-limbo-wand";
HtmlWeb htmlWeb = new HtmlWeb();
HtmlDocument doc = htmlWeb.Load(url);
string weaponName = doc.DocumentNode.SelectNodes("/html/body/div[2]/div[2]/div/div/div/main/div[2]/div/div[2]/h1/text()")[0].InnerText; // <-- NullReferenceException here
Rimozione del text()
nel mio XPath non funziona, e anche il tentativo di ottenere il testo da /html/head/title
non funziona.
C'è qualcosa di sbagliato nel mio XPath? Oppure è un problema con la pagina Web che HTML Agility Pack non può usarlo correttamente?
Grazie in anticipo a chiunque possa darmi qualche suggerimento!
HtmlWeb è solo merda per il recupero della fonte di un sito. Principalmente perché non gestisce i reindirizzamenti. Ma non sono sicuro che questo sia il problema di fondo qui. Utilizzare invece una richiesta Web. così:
HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
try
{
var request = (HttpWebRequest)WebRequest.Create("https://www.dofus.com/en/mmorpg/encyclopedia/weapons/180-limbo-wand");
request.Method = "GET";
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var stream = response.GetResponseStream())
{
doc.Load(stream, Encoding.GetEncoding("iso-8859-9"));
}
}
}
catch (WebException ex)
{
Console.WriteLine(ex.Message);
}
Dopo questo hai un HtmlDocument. E puoi facilmente ottenere il titolo in questo modo (dal momento che esiste un solo tag title):
Console.WriteLine(doc.DocumentNode.SelectNodes("/title")[0].InnerText);
Ora per ottenere il nome dell'arma usando il più semplice e facile xpath sarebbe come questo:
Console.WriteLine(doc.DocumentNode.SelectSingleNode("//h1[@class='ak-return-link']").InnerText.Trim());
Il Trim () alla fine serve solo a rimuovere gli spazi bianchi all'inizio e alla fine della stringa.