Mit HTMLAgilityPack werden alle Werte eines select-Elements abgerufen

c# html-agility-pack winforms

Frage

Hier ist, was ich bisher habe:

            HtmlAgilityPack.HtmlDocument ht = new HtmlAgilityPack.HtmlDocument();


       TextReader reader = File.OpenText(@"C:\Users\TheGateKeeper\Desktop\New folder\html.txt");
        ht.Load(reader);

        reader.Close();

        HtmlNode select= ht.GetElementbyId("cats[]");


        List<HtmlNode> options = new List<HtmlNode>();

        foreach (HtmlNode option in select.ChildNodes)
        {
            if (option.Name == "option")
            {
                options.Add(option);
            }
        }

Jetzt habe ich eine Liste aller "Optionen" für das Select-Element. Auf welche Eigenschaften muss ich zugreifen, um den Schlüssel und den Text zu erhalten?

Wenn also zum Beispiel die Option html für eine Option wäre:

<option class="level-1" value="1">Funky Town</option>

Ich möchte als Ausgabe erhalten:

1 - Funky Town

Vielen Dank

Edit: Ich habe gerade etwas bemerkt. Wenn ich die untergeordneten Elemente der "Select" -Elemente erhielt, gab es Elemente vom Typ "option" und Elemente vom Typ "#text" zurück.

Hmmm .. #text hat die Zeichenfolge, die ich will, aber wählen hat den Wert.

Ich habe gelernt, HTMLAgilityPack war ein HTML-Parser? Warum hat es mir so verwirrende Werte gegeben?

Akzeptierte Antwort

Dies liegt an der Standardkonfiguration für den HTML-Parser; es hat die <option> als HtmlElementFlag.Empty konfiguriert (mit dem Kommentar "sie enthalten manchmal, und manchmal nicht ..."). Das <form> -Tag hat das gleiche Setup (CanOverlap + Empty), das bewirkt, dass sie als leere Knoten im dom erscheinen, ohne untergeordnete Knoten.

Sie müssen dieses Flag vor dem Parsen des Dokuments entfernen.

HtmlNode.ElementsFlags.Remove("option");

Beachten Sie, dass die ElementsFlags-Eigenschaft statisch ist und alle Änderungen sich auf alle weiteren Analysen auswirken.


Beliebte Antwort

edit: Sie sollten die option wahrscheinlich direkt über xpath auswählen. Ich denke, das sollte dafür funktionieren:

var options = select.SelectNodes("option");

Das wird Ihre Optionen ohne die Textknoten erhalten. Die Optionen sollten den gewünschten String enthalten. Warten auf Ihr HTML-Beispiel.

foreach (var option in options)
{
    int value = int.Parse(option.Attributes["value"].Value);
    string text = option.InnerText;

}

EIN
Sie können dem Attribut eine Plausibilitätsprüfung hinzufügen, um sicherzustellen, dass es existiert.



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow