C # Html Agility Pack analysiert Tags mit mehreren Alternativen

c# html html-agility-pack tags

Frage

Ich habe keine Erfahrung mit HTML, also entschuldige jede falsche Terminologie.

Ich versuche, ein HTML-Dokument mit dem HTML Agility Pack zu analysieren, und ich suche nach einer sehr spezifischen Zeichenfolge.

Ich möchte alle Zeichenfolgen des Formulars erhalten:

<img src="..." etc=....">

Also mein Auswahlparameter ist

HtmlNodeCollection images = doc.DocumentNode.SelectNodes("//img[@src]");

Dies führt jedoch auch dazu, dass Strings wie

<img width="..." src="..." etc="..">

Es scheint mir (zumindest nach meinem besten Wissen): Das img-Tag wird gesucht und src muss nur auf dem gleichen Level gefunden werden, nicht unbedingt direkt neben dem img-Tag.

Nachdem ich die Dokumentation betrachtet habe, fühle ich, dass ich versuche, etwas zu tun, was ich mit dieser Funktion nicht tun darf.

Kann jemand bitte den richtigen Weg vorschlagen, dies zu tun? Vielen Dank!

Akzeptierte Antwort

" Das img-Tag wird gesucht und src muss nur auf der gleichen Ebene gefunden werden, nicht unbedingt direkt neben dem img-Tag . "

Es scheint, dass Sie <img> -Element finden möchten, wobei src -Attribute das erste Attribut ist. Beachten Sie, dass der XML / HTML-Parser die Reihenfolge der Attribute nicht beibehalten muss. Daher möchten Sie das Element in der Regel nicht anhand einer bestimmten Attributreihenfolge auswählen, z. B. wo das src Attribut an erster Stelle steht usw.

Wie auch immer, die Reihenfolge der Attribute wird von HAP in meinem vereinfachten Test Attributes[0].Name Daher wurde die Verwendung von Attributes[0].Name * zur Überprüfung des Namens des ersten Attributs auch verwendet:

var raw = @"<div>
    <img src=""..."" etc=""...."">
    <img width=""..."" src=""..."" etc="".."">
    <img>
</div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
var result = doc.DocumentNode
                .SelectNodes("//img[@src]")
                .Where(o => o.Attributes[0].Name == "src")
                .ToList();
foreach (var item in result)
{
    Console.WriteLine(item.OuterHtml);
}

Ausgabe :

<img src="..." etc="....">

*) Der XPath filtert bereits img Elemente, die das Attribut src , also würde Attributes[0].Name niemals NRE erzeugen, falls Sie betroffen sind.


Beliebte Antwort

Ich bin mit XPATH nicht vertraut, also gehe ich davon aus, dass es korrekt ist (ich verwende normalerweise css-Selektoren mit ScrapySharp-Bibliothek zusätzlich zu HtmlAgilityPack).

Das folgende Console-Projektcode-Snippet gibt nur den gewünschten img-Knoten zurück, dh den mit nur zwei Attributen - src und etc, nicht weniger, nicht mehr. Ich lade manuell ein Beispiel html mit 3 Bildknoten, wie folgt:

        HtmlDocument doc = new HtmlDocument();
        string html = @"
            <img src='img1.jpg' />
            <img src='img1.jpg' etc='etcValue' />
            <img width='200px' src='img1.jpg' />
        ";
        doc.LoadHtml(html);

        var relevantImgNodes = doc.DocumentNode.SelectNodes("//img")
            .Where(n => 
                n.Attributes.Count == 2 && 
                !string.IsNullOrEmpty(n.GetAttributeValue("src")) && 
                !string.IsNullOrEmpty(n.GetAttributeValue("etc")));

        Console.WriteLine(relevantImgNodes.Count()); // prints 1


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