Non riesco a far funzionare XPATH con Html Agility Pack

.net c# html-agility-pack xpath

Domanda

Sto cercando di grattare "l'articolo in evidenza di oggi" su Wikipedia ottenendo il valore XPATH usando firebug.

inserisci la descrizione dell'immagine qui

E poi incollandolo nel mio codice:

string result = wc.DownloadString("http://en.wikipedia.org/wiki/Main_Page");

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

            doc.LoadHtml(result);

            var featuredArticle = doc.DocumentNode.SelectSingleNode("/html/body/div[3]/div[3]/div[4]/table[2]/tbody/tr/td/table/tbody/tr[2]/td/div/p");

Tuttavia, featuredArticle restituisce sempre null. Che cosa sto facendo di sbagliato?

Risposta popolare

Perché quello che Firebug mostra come l'XPath come Firefox ha creato l'Html, potrebbe essere o meno l'Html del server. Inoltre, Path from Firebug è assoluto e ogni piccolo cambiamento può romperlo.

E il modo più semplice è quello di dare un'occhiata all'Html, il p-Tag che stai cercando è in un div con l'id mp-tfa , quindi è più semplice fare in modo che XPath cerchi il div e ottenere solo il primo p all'interno.

Come questo:

var wc = new WebClient();
var doc = new HtmlDocument();
doc.Load(wc.OpenRead("http://en.wikipedia.org/wiki/Main_Page"));
var featuredArticle = doc.DocumentNode.SelectSingleNode("//div[@id='mp-tfa']/p");
Console.WriteLine(featuredArticle.InnerText);

Il posto migliore per imparare a usare XPath è w3schools.com .

Oppure potresti usare Linq, anche se ritengo che XPath sia un po 'più chiaro.

var featuredArticle=   doc.DocumentNode.Descendants("div")
 .First(n => n.Id == "mp-tfa")
 .Descendants("p").FirstOrDefault();


Related

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é