usar parser parse htmldocument htmlagilitypack como agility c# .net html parsing html-agility-pack

c# - parser - ¿El Html Agility Pack sigue siendo el mejor analizador HTML.NET?



htmlagilitypack xpath (7)

Html Agility Pack fue dado como respuesta a una pregunta de StackOverflow hace algún tiempo, ¿sigue siendo la mejor opción? ¿Qué otras opciones se deben considerar? ¿Hay algo más ligero?


Html Agility Pack fue dado como la respuesta a una pregunta de hace algún tiempo

El Html Agility Pack sigue siendo una excelente solución para analizar HTML.

sigue siendo la mejor opción?

¿Mejor? bueno, todo depende de la tarea que tenga entre manos, pero en general creo que sí. Hay ocasiones en las que no es ideal, pero en general hará un gran trabajo.

¿Hay algo más ligero?

Puede probar esto: http://csharptest.net/browse/src/Library/Html/ No es más que una mano llena de archivos fuente que distinguen HTML / XML a través de Regex. Admite DOM y XPath ligeros, pero no mucho más. ( contenido de ayuda )

[Ejemplo]

public void TestParse() { string notxml = "<html id=a ><body foo=''bar'' bar=/"foo/" />"; var html = new HtmlLightDocument(notxml).Root; Assert.AreEqual("html", html.TagName); Assert.AreEqual(1, html.Attributes.Count); Assert.AreEqual("a", html.Attributes["id"]); Assert.AreEqual(1, html.Children.Count); }

Alternativamente, puede usar el analizador directamente en lugar de construir un árbol DOM. Simplemente implemente la interfaz IXmlLightReader y llame al método estático XmlLightParser.Parse .

PD: Fue escrito para resolver un debate interno: ¡que Regex puede analizar HTML! Desde entonces, hemos encontrado muchos usos, ya que es lo suficientemente liviano como para incrustarlo en cualquier lugar. Todavía hay formas de confundir el generador de jerarquías DOM, pero no he encontrado ningún HTML que el analizador no maneje.


Cuando se trata de analizar HTML, no hay comparación con el real. Este es un puerto C # del analizador validator.nu . Esta es la misma base de código utilizada por los navegadores basados ​​en Gecko (por ejemplo, Firefox). Hay repo parece un poco polvoriento, pero no te dejes engañar ... el puerto es excepcional. Simplemente ha sido pasado por alto. Lo CsQuery en CsQuery aproximadamente un mes. Pasa todas las pruebas CsQuery (que incluyen la mayoría de las pruebas jQuery y Sizzle portadas a C #).

No conozco ningún otro analizador HTML5 escrito en C #, o incluso ninguno que se acerque ni remotamente a hacer un buen trabajo en términos de manejo de etiquetas faltantes, opcionales y no válidas. Sin embargo, esto no solo hace un gran trabajo: cumple con los estándares.

El repositorio al que he vinculado anteriormente es el puerto original, incluye un contenedor básico que produce un árbol de nodos XML. Las versiones de CsQuery 1.3 y posteriores usan este analizador.


El mejor es un término muy relativo, para su pregunta, me imagino que está buscando una herramienta confiable, por lo que creo que esta característica debe tenerse en cuenta. Buscaría el apoyo y la fortaleza de la compañía que proporciona la herramienta. Es una sensación horrible cuando intentas contactar al soporte técnico para cualquier herramienta que utiliza y la respuesta es que esta empresa ya no existe. Como HAP es mantenido por la comunidad de desarrolladores, preferiría confiar en ella.


Hay una spreadsheet con las comparaciones.

En resumen:

CsQuery Performance frente a Html Agility Pack y Fizzler Recopilé algunas pruebas de rendimiento para comparar CsQuery con la única alternativa práctica que conozco (Fizzler, una extensión HtmlAgilityPack). Probé contra tres documentos diferentes:

  • El documento de prueba sizzle (alrededor de 11 k)
  • La entrada de wikipedia para "queso" (alrededor de 170 k)
  • La especificación HTML 5 de una sola página (alrededor de 6 megabytes)

Los resultados generales son:

  • HAP es más rápido al cargar la cadena de HTML en un modelo de objetos. Esto tiene sentido, ya que no creo que Fizzler construya un índice (o tal vez solo construya uno relativamente simple). CsQuery tarda entre 1.1 y 2.6x más para cargar el documento. Más sobre esto a continuación.
  • CsQuery es más rápido para casi todo lo demás. A veces por factores de 10,000 o más. La única excepción es el selector "*", donde a veces Fizzler es más rápido. Para todas las pruebas, los resultados están completamente enumerados; este caso solo resulta en cada nodo en el árbol que se enumera. Por lo tanto, esto no prueba tanto el motor de selección como la estructura de datos.
  • CsQuery hizo un mejor trabajo al devolver los mismos resultados que un navegador. Cada uno de los selectores aquí se verificó con el mismo documento en Chrome utilizando jQuery 1.7.2 y los números coinciden con los devueltos por CsQuery. Esto es probablemente porque HtmlAgilityPack maneja las etiquetas opcionales (que faltan) de manera diferente. Además, nth-child no se implementa completamente en Fizzler, solo admite valores simples (no fórmulas).

He usado esto antes, api bastante fácil de fluir. Creo que en el dominio C # / .Net, esta es una muy buena opción.

Hay una biblioteca de Java here . Se ve bastante bien, aunque no tengo experiencia personal.


Si está preparado para mirar fuera del mundo .NET , la comunidad Python SO recomienda Beautiful Soup , por ejemplo html-parser-in-python .

Beautiful Soup es un analizador de HTML / XML de Python diseñado para proyectos de entrega rápida como screen-raspado.


También hay AngleSharp

AngleSharp es una biblioteca .NET que le da la capacidad de analizar hiper-textos basados ​​en ángulos como HTML, SVG y MathML. XML sin validación también es compatible con la biblioteca. Un aspecto importante de AngleSharp es que CSS también se puede analizar. El analizador se basa en la especificación W3C oficial. Esto produce una representación DOM HTML5 perfectamente portátil del código fuente dado. También las características actuales como querySelector o querySelectorAll funcionan para el recorrido de árbol.