Obtenga datos específicos de una página web con HTMLAgilityPack

c# html-agility-pack xpath

Pregunta

He estado tratando de obtener datos de una página web en C # usando el paquete de agilidad HTML. He podido recuperar datos de diferentes páginas web, pero en esta página web NullReferenceException una NullReferenceException y mi única suposición es que tiene algo que ver con el XPath.

Aquí está mi código, tratando de llegar al texto '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

Eliminar el text() en mi XPath no funciona, e incluso intentar obtener el texto de /html/head/title no funciona.

¿Hay algo mal con mi XPath? ¿O es un problema con la página web que HTML Agility Pack no puede usar correctamente?

¡Gracias de antemano a cualquiera que pueda darme algunos consejos!

Respuesta popular

HtmlWeb es una mierda para obtener la fuente de un sitio. Sobre todo porque no maneja redirecciones. Pero no estoy seguro de que ese sea el problema subyacente aquí. Utilice una solicitud web en su lugar. al igual que:

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

Después de esto tienes un documento Html. Y puede obtener fácilmente el título así (ya que solo hay una etiqueta de título):

Console.WriteLine(doc.DocumentNode.SelectNodes("/title")[0].InnerText);

Ahora, para obtener el nombre del arma utilizando el xpath más simple y fácil sería así:

Console.WriteLine(doc.DocumentNode.SelectSingleNode("//h1[@class='ak-return-link']").InnerText.Trim());

El recorte () al final es solo para eliminar los espacios en blanco al principio y al final de la cadena.



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é