HTML mit HTMLAgilityPack analysieren

c# html-agility-pack

Frage

Ich habe den folgenden HTML-Code, den ich mit dem HTML Agility Pack analysieren möchte.

Dies ist ein Ausschnitt der gesamten Datei, die vom Code zurückgegeben wird:

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

Ich erhalte diesen Codeschnipsel mit dem folgenden Code (der unordentlich ist, weiß ich)

string url = "http://www.domain.com/story.html";
var webGet = new HtmlWeb();
var document = webGet.Load(url);

var links = document.DocumentNode
        .Descendants("div")
        .Where(div => div.GetAttributeValue("class", "").Contains("story-body fnt-13 p20-b user-gen")) //
        .SelectMany(div => div.Descendants("p"))
        .ToList();
int cn = links.Count;

HtmlAgilityPack.HtmlNodeCollection tl = document.DocumentNode.SelectNodes("/html[1]/body[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]");
foreach (HtmlAgilityPack.HtmlNode node in tl)
{
    textBox1.AppendText(node.InnerText.Trim());
    textBox1.AppendText(System.Environment.NewLine);
}

Der Code durchläuft jedes p und hängt es (vorerst) an eine Textbox an. Alles funktioniert korrekt anders als das div Tag mit der Klassengalerie gallery clr bdr aln-c js-no-shadow mod cld . Das Ergebnis dieses bisschen HTML ist, dass ich die &#8203; und Untertitel-Text-Bits.

Was ist der beste Weg, um dies aus den Ergebnissen wegzulassen?

Akzeptierte Antwort

XPATH ist dein Freund. Probieren Sie das aus und vergessen Sie diese beschissene Xlink-Syntax :-)

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

Dieser Ausdruck wählt alle P-Knoten aus, für die keine Attribute festgelegt sind. Sehen Sie hier für andere Beispiele: XPath Syntax


Beliebte Antwort

Es ist nicht ganz klar, was Sie fragen. Ich denke, du fragst, wie man nur die direkten Nachkommen eines bestimmten Divs bekommt. Wenn das der Fall ist, dann verwenden Sie ChildNodes und nicht Descendants . Das ist:

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

Das Problem besteht darin, dass Descendants einen vollständig rekursiven Durchlauf des Dokumentbaums ausführt.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum