2009-06-30 26 views
52

Html Agility Pack se dio como la respuesta a un StackOverflow question hace algún tiempo, ¿sigue siendo la mejor opción? ¿Qué otras opciones se deben considerar? ¿Hay algo más ligero?¿El Html Agility Pack sigue siendo el mejor analizador HTML .NET?

+0

La falta de un analizador HTML es una omisión flagrante de la biblioteca estándar de .NET. "Hacer una solicitud http y analizar la respuesta" es pan comido en la era de la web, el segundo programa que las personas escriben después de 'hola mundo'. –

+0

@ColonelPanic, estos días con la mayoría de las páginas web que usan jscript para obtener los datos, necesita más que un analizador HTML. –

+0

Consulte la revisión de diciembre de 2015 http://forcewake.me/how-to-parse-html-in-dotnet/, AngleSharp se mantiene activamente (https://dotnet.libhunt.com/project/anglesharp/vs/htmlagilitypack) –

Respuesta

49

Hay un spreadsheet con las comparaciones.

En resumen:

Rendimiento CsQuery vs HTML agilidad Pack and Fizzler junté algunas pruebas de rendimiento para comparar CsQuery a la única alternativa práctica que yo sepa (Fizzler, una extensión HtmlAgilityPack). Me probados contra tres documentos diferentes:

  • el documento de prueba chisporroteo (alrededor de 11 k)
  • la entrada de Wikipedia para "queso" (alrededor de 170 k)
  • La sola página HTML 5 spec (alrededor 6 megabytes)

los resultados generales son:

  • HAP es más rápida a la carga de la cadena de HTML en un n modelo de objeto. Esto tiene sentido, ya que no creo que Fizzler construya un índice (o , quizás construya solo uno relativamente simple). CsQuery toma desde 1.1 hasta 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 da como resultado que cada nodo en el árbol sea enumerado. 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 (faltantes) de manera diferente. Además, nth-child no está implementado completamente en Fizzler, solo admite valores simples (no fórmulas).
+0

Awesonium también debería formar parte de esta lista. ¡Es aún más genial, puede evaluar y ejecutar Javascript! – jessehouwing

+0

http://www.awesomium.com/ – jessehouwing

+2

Html Agility Pack es un analizador HTML, no un navegador sin cabeza, como lo es Awesonium. –

2

He usado esto antes, api bastante fácil de manejar. 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.

1

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

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

9

HTML agilidad Pack fue dada como la respuesta a una pregunta StackOverflow hace algún tiempo

La agilidad paquete de HTML es todavía una solución excelente para analizar HTML.

sigue siendo el mejor opción?

¿Lo vale? 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?

Usted podría intentar esto: http://csharptest.net/browse/src/Library/Html/ No es nada más que una de archivos fuente que machacar a HTML/XML a través de expresiones regulares completo a mano. Admite DOM y XPath ligeros, pero no mucho más. (help contents)

[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 utilizar 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.

+0

Hay un 'ExampleAttribute' en uso en el texto. =) –

33

Cuando se trata de análisis de HTML, no hay comparación con la realidad. Este es un analizador C# port of the 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 integé en CsQuery hace 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 original, incluye un contenedor básico que produce un árbol de nodos XML. Las versiones de CsQuery 1.3 y posteriores usan este analizador.

+8

Me encantó el hecho de que la respuesta aceptada sea un enlace a un artículo en _your_ blog y un párrafo que cite _you_. +400 reputación por la victoria, Haha. –

2

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 empresa que proporciona la herramienta. Es una sensación horrible cuando intenta ponerse en contacto con el soporte técnico para cualquier herramienta que utilice y la respuesta es que esta empresa ya no existe. Como HAP es mantenido por la comunidad de desarrolladores, preferiría confiar en ella.

7

También hay AngleSharp

AngleSharp es una biblioteca .NET que proporciona la capacidad de analizar escuadras hiper-textos basados ​​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.

Cuestiones relacionadas