Utilisation de HTMLAgilityPack pour obtenir toutes les valeurs d'un élément select

c# html-agility-pack winforms

Question

Voici ce que j'ai jusqu'à présent:

            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);
            }
        }

Maintenant, j'ai une liste de toutes les "options" pour l'élément select. À quelles propriétés dois-je accéder pour obtenir la clé et le texte?

Donc si par exemple le HTML pour une option serait:

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

Je veux obtenir en sortie:

1 - Funky Town

Merci

Edit: Je viens de remarquer quelque chose. Lorsque j'ai eu les éléments enfants des éléments "Select", ils ont renvoyé des éléments de type "option" et des éléments de type "#text".

Hmmm .. #text a la chaîne que je veux, mais select a la valeur.

Je pensais que HTMLAgilityPack était un analyseur HTML? Pourquoi cela m'a-t-il donné des valeurs déroutantes comme celle-ci?

Réponse acceptée

Cela est dû à la configuration par défaut de l'analyseur HTML. il a configuré l' <option> comme HtmlElementFlag.Empty (avec le commentaire "ils contiennent parfois, et parfois ils ne ..."). La <form> a la même configuration (CanOverlap + Empty), ce qui les fait apparaître comme des nœuds vides dans le dom, sans aucun nœud enfant.

Vous devez supprimer cet indicateur avant d'analyser le document.

HtmlNode.ElementsFlags.Remove("option");

Notez que la propriété ElementsFlags est statique et que toute modification aura une incidence sur toutes les analyses ultérieures.


Réponse populaire

edit: vous devriez probablement sélectionner les nœuds d’ option directement via xpath. Je pense que cela devrait fonctionner pour ça:

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

cela donnera vos options sans les nœuds de texte. les options doivent contenir la chaîne que vous voulez quelque part. en attente de votre échantillon html.

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

}

UNE
vous pouvez ajouter un contrôle de cohérence sur l'attribut pour vous assurer qu'il existe.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow