Obtener valor entre las etiquetas html Xpath y HtmlAgility

c# html html-agility-pack html-parsing xpath

Pregunta

Hasta ahora estoy intentando recuperar el texto entre etiquetas HTML para un sitio web determinado ...

Por ejemplo, necesito extraer el texto entre estas etiquetas de separación. ¿Cómo voy a hacer eso? Recibo un error que dice "la referencia del objeto no está configurada para una instancia de un objeto" aquí está el HTML

También hay un código HTML antes de esta parte aquí; No sé si eso debería hacer una diferencia.

<div class="thumbnail-details">
<ul>
    <li> … </li>
    <li class="product-title">
        <span class="thumbnail-details-grey">The Blaster Portable Wireless Speaker in Black</span>
    </li>
    <li> … </li>
</ul>
</div>

Hasta ahora mi código C # es

    HtmlWeb hw = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument htmlDoc = hw.Load(@"http://www.karmaloop.com/Browse.htm#Pgroup=1");
        if (htmlDoc.DocumentNode != null)
        {
            foreach (HtmlNode text in htmlDoc.DocumentNode.SelectNodes("//span[@class='thumbnail-details-grey']/text()"))
            {
                Console.WriteLine(text.InnerText);
            }

¿Puedo obtener ayuda aquí? Quiero extraer el "Altavoz inalámbrico portátil Blaster en negro". Cualquier ayuda será útil, gracias de antemano.

Respuesta aceptada

Su código funciona bien, pero tendrá que cargar la página correcta para que funcione. La página que está cargando utiliza una solicitud ajax para cargar los resultados que ve en su navegador.

Así que en lugar de la url que está utilizando actualmente tiene que usar:

HtmlDocument htmlDoc = hw.Load(@"http://www.karmaloop.com/Browse?Pgroup=1&ajax=true&version=2");

Entonces su código funciona. Todavía estoy buscando el lugar donde se reúne esta solicitud ...

Pero la consulta parece bastante fácil de adivinar. Por ejemplo, la página http://www.karmaloop.com/Browse.htm#Pdept=11&PageSize=30&Pgroup=1 solicita la url http://www.karmaloop.com/Browse?Pdept=11&PageSize=30&Pgroup=1&ajax=true&version=2 . Así que todo lo que tienes que hacer es usar tu url y construir una nueva comenzando después del # .


Respuesta popular

Recomiendo usar CsQuery ( https://www.nuget.org/packages/CsQuery/1.3.4 ) y luego es tan simple como:

var doc = CQ.CreateFromUrl(@"http://www.karmaloop.com/Browse.htm");
var nodes = doc.Find("span.thumbnail-details-grey");
foreach(var node in nodes)
    Console.WriteLine(node.InnerText);


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é