¿Se puede usar Html Agility Pack para analizar fragmentos HTML?

.net c# html html-agility-pack parsing

Pregunta

Necesito obtener los elementos LINK y META de las páginas ASP.NET, los controles de usuario y las páginas maestras, capturar su contenido y luego volver a escribir los valores actualizados de estos archivos en una utilidad en la que estoy trabajando.

Podría intentar usar expresiones regulares para capturar solo estos elementos, pero hay varios problemas con ese enfoque:

  • Espero que muchos de los archivos de entrada contengan HTML dañado (elementos faltantes / fuera de secuencia, etc.)
  • Elementos de SCRIPT que contienen comentarios y / o VBScript / JavaScript que parecen elementos válidos, etc.
  • Necesito poder realizar comentarios condicionales de IE en casos especiales y elementos META y LINK dentro de los comentarios condicionales de IE
  • Sin mencionar que HTML no es un lenguaje regular.

Hice algunas investigaciones para analizadores HTML en .NET y muchas publicaciones y blogs de SO recomiendan el Paquete de agilidad HTML . Nunca lo he usado antes y no sé si puede analizar fragmentos de HTML y HTML rotos. (Por ejemplo, imagine un control de usuario que solo contenga un elemento HEAD con algo de contenido, sin HTML ni BODY ). Sé que podría leer la documentación pero me ahorraría bastante tiempo si alguien pudiera asesorarlo. (La mayoría de las publicaciones SO implican analizar páginas HTML completas).

Respuesta aceptada

Absolutamente, eso es en lo que se destaca.

De hecho, muchas páginas web que encontrarás en el mundo salvaje podrían describirse como fragmentos HTML, debido a que faltan etiquetas <html> o etiquetas cerradas incorrectamente.

El HtmlAgilityPack simula lo que tiene que hacer el navegador: intente dar sentido a lo que a veces es una mezcla de etiquetas que no coinciden. Una ciencia imperfecta, pero HtmlAgilgityPack lo hace muy bien.


Respuesta popular

Una alternativa a Html Agility Pack es CsQuery , un puerto de C # jQuery del cual soy el autor principal. Le permite utilizar los selectores de CSS y la API de consulta completa para acceder y manipular el DOM, que para muchas personas es más fácil que XPATH. Además, su analizador de HTML está diseñado específicamente con una variedad de propósitos en mente y hay varias opciones para analizar HTML: como un documento completo (faltan html, body se agregarán etiquetas de html, body y cualquier contenido huérfano se moverá dentro del cuerpo); como un bloque de contenido (lo que significa que no se ajustará como un documento completo, pero las etiquetas opcionales como tbody que aún son obligatorias en el DOM se agregan automáticamente, al igual que los navegadores), y como un fragmento verdadero donde no hay etiquetas creado (por ejemplo, en caso de que estés trabajando con bloques de construcción).

Vea crear un nuevo DOM para detalles.

Además, el analizador HTML de CsQuery ha sido diseñado para cumplir con la especificación HTML5 para etiquetas de cierre opcionales. Por ejemplo, cerrar las etiquetas p es opcional, pero hay reglas específicas que determinan cuándo se debe cerrar el bloque. Para producir el mismo DOM que un navegador, el analizador necesita implementar las mismas reglas. CsQuery hace esto para proporcionar un alto grado de compatibilidad con el DOM del navegador para una fuente determinada.

Usar CsQuery es muy sencillo, por ejemplo

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

Finalmente, CsQuery indexa los documentos en los selectores de clase, id, atributo y creación de etiquetas de forma extremadamente rápida en comparación con el paquete de agilidad de HTML.



Related

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é