Uso de HTMLAgilityPack para obtener todos los valores de un elemento seleccionado

c# html-agility-pack winforms

Pregunta

Aquí está lo que tengo hasta ahora:

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

Ahora tengo una lista de todas las "opciones" para el elemento de selección. ¿A qué propiedades debo acceder para obtener la clave y el texto?

Así que si, por ejemplo, el html para una opción sería:

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

Quiero obtener como salida:

1 - Funky Town

Gracias

Editar: Acabo de notar algo. Cuando obtuve los elementos secundarios de los elementos "Select", devolvió elementos de tipo "option" y elementos de tipo "#text".

Hmmm .. #text tiene la cadena que quiero, pero select tiene el valor.

¿Pensé que HTMLAgilityPack era un analizador html? ¿Por qué me dio valores tan confusos como este?

Respuesta aceptada

Esto se debe a la configuración predeterminada para el analizador html; ha configurado la <option> como HtmlElementFlag.Empty (con el comentario 'a veces contienen, y otras veces no ...'). La etiqueta <form> tiene la misma configuración (CanOverlap + Empty) que hace que aparezcan como nodos vacíos en el dom, sin ningún nodo secundario.

Debe eliminar esa marca antes de analizar el documento.

HtmlNode.ElementsFlags.Remove("option");

Tenga en cuenta que la propiedad ElementsFlags es estática y cualquier cambio afectará a todos los análisis posteriores.


Respuesta popular

Editar: probablemente debería seleccionar los nodos de option directamente a través de xpath. Creo que esto debería funcionar para eso:

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

que obtendrá sus opciones sin los nodos de texto. las opciones deben contener esa cadena que quieres en algún lugar. esperando su muestra html

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

}

UN
puede agregar un poco de comprobación de cordura en el atributo para asegurarse de que existe.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué