parser htmlagilitypack agility html parsing html-agility-pack

parser - htmlagilitypack xpath



HtmlAgilityPack Drops OpciĆ³n End Tags (2)

El mismo error se informa en la discusión de la página de inicio de HAP, pero parece que no se han realizado correcciones significativas al proyecto en unos pocos años. No es alentador

Una búsqueda rápida de la fuente sugiere que el error puede corregirse comentando la línea 92 de HtmlNode.cs:

// they sometimes contain, and sometimes they don ''t... ElementsFlags.Add("option", HtmlElementFlag.Empty);

(De hecho no, siempre contienen texto de etiqueta, aunque una cadena en blanco también sería un texto válido. Un autor descuidado podría omitir la etiqueta final, pero entonces eso es cierto para cualquier elemento).

AÑADIR

Una solución equivalente es llamar a HtmlNode.ElementsFlags.Remove("option"); antes de cualquier uso de liberary (sin necesidad de modificar el código fuente de origen)

Estoy usando HtmlAgilityPack. Creo un HtmlDocument y LoadHtml con la siguiente cadena:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

Esto hace algunas cosas inesperadas. Primero, da dos errores del analizador, EndTagNotRequired. En segundo lugar, el nodo de selección tiene 4 hijos: dos para las etiquetas de opción y dos más para el texto interno de las etiquetas de opción. Por último, el OuterHtml es así:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One<option value="2">Two</select>

Básicamente, es decisión de mí soltar las etiquetas de cierre en las opciones. Dejemos de lado por un momento si es apropiado y deseable hacerlo. Estoy usando HtmlAgilityPack para probar el código de generación de HTML, por lo que no quiero que tome ninguna decisión por mí ni que cometa ningún error a menos que el HTML esté realmente mal formado. ¿Hay alguna forma de hacer que se comporte como yo quiero? Intenté establecer algunas de las opciones para HtmlDocument, específicamente:

doc.OptionAutoCloseOnEnd = false; doc.OptionCheckSyntax = false; doc.OptionFixNestedTags = false;

Esto no está funcionando. Si HtmlAgilityPack no puede hacer lo que quiero, ¿puede recomendar algo que pueda?


Parece que hay alguna razón para no analizar la etiqueta de opción como una etiqueta "genérica", para el cumplimiento de XHTML, sin embargo, esto puede ser un verdadero dolor en el cuello.

Mi sugerencia es hacer una cadena completa de reemplazar y cambiar todas las etiquetas de "opción" a "my_option", de esa manera usted:

  1. No tiene que modificar la fuente de la biblioteca (y puede actualizarla más tarde).
  2. Puede analizar como lo haría normalmente.

La publicación original en el foro HtmlAgilityPack se puede encontrar en: http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982