Analizar HTML usando HTMLAgilityPack

c# html-agility-pack

Pregunta

Tengo el siguiente código HTML que intento analizar utilizando el paquete de agilidad de HTML.

Este es un fragmento de todo el archivo que devuelve el código:

<div class="story-body fnt-13 p20-b user-gen">
    <p>text here text here text </p>
    <p>text here text here text text here text here text text here text here text text here text here text </p>
    <div  class="gallery clr bdr aln-c js-no-shadow mod  cld">
        <div>
            <ol>
                <li class="fader-item aln-c ">
                    <div class="imageWrap m10-b">
                       &#8203;<img class="http://www.domain.com/picture.png| " src="http://www.domain.com/picture.png" alt="alt text" />
                    </div>
                    <p class="caption">caption text</p>
                </li>
            </ol>
        </div>
    </div >
    <p>text here text here text text here text here text text here text here text text here text here text </p>
    <p>text here text here text text here text here text text here text here text text here text here text text here text here text </p>
    <p>text here text here text text here text here text text here text here text text here text here text text here text here text </p>
</div>

Recibo este fragmento de código usando lo siguiente (lo cual es desordenado, lo sé)

<div class="story-body fnt-13 p20-b user-gen">
    <p>text here text here text </p>
    <p>text here text here text text here text here text text here text here text text here text here text </p>
    <div  class="gallery clr bdr aln-c js-no-shadow mod  cld">
        <div>
            <ol>
                <li class="fader-item aln-c ">
                    <div class="imageWrap m10-b">
                       &#8203;<img class="http://www.domain.com/picture.png| " src="http://www.domain.com/picture.png" alt="alt text" />
                    </div>
                    <p class="caption">caption text</p>
                </li>
            </ol>
        </div>
    </div >
    <p>text here text here text text here text here text text here text here text text here text here text </p>
    <p>text here text here text text here text here text text here text here text text here text here text text here text here text </p>
    <p>text here text here text text here text here text text here text here text text here text here text text here text here text </p>
</div>

El código recorre cada p y (por ahora) lo agrega a un cuadro de texto. Todo funciona correctamente, excepto la etiqueta div con la gallery clr bdr aln-c js-no-shadow mod cld clases gallery clr bdr aln-c js-no-shadow mod cld . El resultado de este bit HTML es que obtengo el &#8203; y los bits de texto de subtítulos.

¿Cuál es la mejor manera de omitir eso de los resultados?

Respuesta aceptada

XPATH es tu amigo. Prueba esto y olvídate de esa sintaxis de xlink :-)

HtmlNodeCollection tl = document.DocumentNode.SelectNodes("//p[not(@*)]");
foreach (HtmlAgilityPack.HtmlNode node in tl)
{
    Console.WriteLine(node.InnerText.Trim());
}

Esta expresión seleccionará todos los nodos P que no tienen ningún conjunto de atributos. Vea aquí para otras muestras: Sintaxis de XPath


Respuesta popular

No está muy claro lo que estás preguntando. Creo que estás preguntando cómo obtener solo los descendientes directos de un div en particular. Si ese es el caso, entonces use ChildNodes lugar de Descendants . Es decir:

.SelectMany(div => div.ChildNodes().Where(n => n.Name == "p"))

El problema es que los Descendants hacen un recorrido completamente recursivo del árbol de documentos.




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é