Analisi dell'HTML con HTMLAgilityPack

c# html-agility-pack

Domanda

Ho il seguente codice HTML che sto cercando di analizzare utilizzando l'HTML Agility Pack.

Questo è un frammento di tutto il file che viene restituito dal codice:

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

Ottengo questo frammento di codice usando il seguente (che è disordinato lo so)

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

Il codice scorre attraverso ogni p e (per ora) lo aggiunge ad una casella di testo. Tutto funziona correttamente oltre al tag div con la classe class gallery clr bdr aln-c js-no-shadow mod cld . Il risultato di questo bit di HTML è che ottengo il &#8203; e bit di testo didascalia.

qual è il modo migliore per ometterlo dai risultati?

Risposta accettata

XPATH è tuo amico. Prova questo e dimentica la sintassi di xlink crappy :-)

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

Questa espressione selezionerà tutti i nodi P che non hanno alcun attributo impostato. Vedi qui per altri esempi: Sintassi XPath


Risposta popolare

Non è abbastanza chiaro cosa stai chiedendo. Penso che tu stia chiedendo come ottenere solo i discendenti diretti di un particolare div. In tal caso, utilizzare ChildNodes anziché Descendants . Questo è:

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

Il problema è che i Descendants eseguono una passeggiata completamente ricorsiva dell'albero del documento.




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é