Utilizzo di HTMLAgilityPack per ottenere tutti i valori di un elemento select

c# html-agility-pack winforms

Domanda

Ecco cosa ho finora:

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

Ora ho una lista di tutte le "opzioni" per l'elemento select. Quali proprietà devo accedere per ottenere la chiave e il testo?

Quindi se per esempio l'html per una opzione sarebbe:

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

Voglio ottenere come risultato:

1 - Funky Town

Grazie

Edit: ho appena notato qualcosa. Quando ho ottenuto gli elementi figlio degli elementi "Seleziona", ha restituito elementi di tipo "opzione" ed elementi di tipo "#testo".

Hmmm .. #text ha la stringa che voglio, ma select ha il valore.

Ho pensato che HTMLAgilityPack fosse un parser html? Perché mi ha dato valori confusionari come questo?

Risposta accettata

Ciò è dovuto alla configurazione predefinita per il parser html; ha configurato l' <option> come <option> HtmlElementFlag.Empty (con il commento "a volte contengono e talvolta non ..."). Il tag <form> ha la stessa impostazione (CanOverlap + Empty) che li fa apparire come nodi vuoti nella dom, senza alcun nodo figlio.

È necessario rimuovere quel flag prima di analizzare il documento.

HtmlNode.ElementsFlags.Remove("option");

Si noti che la proprietà ElementsFlags è statica e qualsiasi modifica interesserà ogni ulteriore analisi.


Risposta popolare

modifica: probabilmente dovresti selezionare i nodi option direttamente tramite xpath. Penso che questo dovrebbe funzionare per questo:

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

che otterrà le tue opzioni senza i nodi di testo. le opzioni dovrebbero contenere quella stringa che vuoi da qualche parte. in attesa del tuo campione html.

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

}

UN
puoi aggiungere alcuni controlli di integrità sull'attributo per assicurarti che esista.



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é