Selección de valores de opciones HTML individualmente usando HTMLAgilityPack

c# html-agility-pack

Pregunta

Estoy tratando de obtener los valores de una lista de opciones como elementos individuales, pero este código, en lugar de eso, simplemente agarra la lista completa en un elemento. Aquí está el código que estoy usando:

List<string> chapterTitles = new List<string>();
HtmlNode.ElementsFlags.Remove("option");
doc.LoadHtml(htmlContent);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//select[@id='chap_select']/option"))
chapterTitles.Add(node.InnerText);

Lo que sucede es que el primer elemento de chapterTitles tiene el conjunto completo de valores de opción, en lugar de (por ejemplo), habiendo 12 entradas diferentes en la lista que corresponden a una lista de opciones con 12 valores.

Aquí está el segmento HTML que estoy tratando de analizar:

<SELECT id=chap_select title="Chapter Navigation" Name=chapter onChange="self.location = '/s/5231611/'+ this.options[this.selectedIndex].value + '/Behind-Enemy-Lines-I-Light-Hammer';"><option  value=1 selected>1. Prologue<option  value=2 >2. Chapter One<option  value=3 >3. Chapter Two<option  value=4 >4. Chapter Three<option  value=5 >5. Chapter Four<option  value=6 >6. Chapter Five<option  value=7 >7. Chapter Six<option  value=8 >8. Chapter Seven<option  value=9 >9. Chapter Eight<option  value=10 >10. Chapter Nine<option  value=11 >11. Chapter Ten<option  value=12 >12. Chapter Eleven</select>

¿Alguna sugerencia?

Respuesta aceptada

HtmlAgilityPack no parece analizar ese código realmente bien. Por ejemplo, el código

<option  value=3 >3. Chapter Two<option  value=4 >...

realmente debería ser

<option value="3">3. Chapter Two</option>
<option value="4">...

Entonces, lo que te propongo analizar es hacer lo siguiente:

var doc = .. //Load the HTML code here.
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//select[@id='chap_select']/option")) {
    chapterTitles.Add(node.NextSibling.InnerText);
}

Las dos principales diferencias:

  1. HtmlNode.ElementsFlags.Remove("option");
  2. Los textos se encuentran en los nodos que están al lado de los nodos de option (en lugar de dentro);


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow