No puedo hacer que XPATH trabaje con Html Agility Pack

.net c# html-agility-pack xpath

Pregunta

Estoy intentando raspar el "artículo destacado de hoy" en Wikipedia obteniendo el valor XPATH usando firebug.

introduzca la descripción de la imagen aquí

Y luego pegarlo en mi código:

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

Sin embargo, el artículo destacado siempre devuelve nulo. ¿Qué estoy haciendo mal?

Respuesta popular

Debido a que Firebug muestra que el XPath como Firefox hizo el Html, eso puede o no ser lo que es el Html del servidor. Además, el Camino de Firebug es absoluto, y cada pequeño cambio puede romperlo.

Y la forma más sencilla es simplemente mirar el Html, la etiqueta p que está buscando está en un div con el id mp-tfa , por lo que es más fácil hacer que el XPath busque el div y que solo obtenga la primera p dentro.

Me gusta esto:

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);

El mejor lugar para aprender a usar XPath es w3schools.com .

O podrías usar Linq, aunque siento que XPath es un poco más claro.

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué