C # HTMLAgilityPack VS expresiones regulares para extraer enlaces de HTML

c# html-agility-pack html-parsing regex

Pregunta

Estoy escribiendo un rastreador web de C # y, cuando ejecuto el perfil, puedo ver que HTMLAgilityPack's LoadHTML método HTMLAgilityPack's LoadHTML utiliza el 10% del uso total de CPU de los programas. Me gustaría intentar y bajar esto.

Estoy seguro de que una expresión regular sería más rápida, pero al mirar los ejemplos de extracción de enlaces en SO, veo que todos dicen que este método debería evitarse en favor de un analizador html como HTMLAgilityPack .

Como todo lo que debo hacer es extraer enlaces de HTML, ¿está usando HTMLAgilityPack en lugar de kill?

¿Las razones para favorecer un analizador HTML son aplicables a mi caso, ya que solo lo estoy usando para extraer enlaces?


HTML descargado con WebClient luego comparado.

Usando href\\s*=\\s*(?:[\"'](?<1>[^\"']*)[\"']|(?<1>\\S+)) (entonces Recortar y agregar a una lista es mucho más rápido que HTMLAgilityPack.

43 milisegundos en comparación con 3 consistentemente.


Ver mi codigo en pastebin

Respuesta aceptada

¿Las razones para favorecer un analizador HTML son aplicables a mi caso, ya que solo lo estoy usando para extraer enlaces?

En su caso, el analizador de HTML es excesivo como lo han demostrado sus pruebas.

Las personas que responden en SO lo usan como respuesta de rutina a todas las preguntas de expresiones regulares. Uno debería usar la herramienta si realmente necesita analizar el dominio del HTML de una manera más robusta.


Las personas que sienten que son demasiado lentas o engorrosas [para aprender] encuentran sesgos en contra de las expresiones regulares. Existe cierto mérito sobre lo que proponen para ciertas operaciones, ya que el texto optimizado específico para encontrar utilidades tiene un mejor desempeño. Claro que estoy de acuerdo, pero descartar el regex de la mano, bueno, eso es parte del curso en StackOverflow.

Porque es eso A veces, el análisis es simplemente defectuoso porque el patrón proporcionado introduce una gran cantidad de retroceso innecesario y no está optimizado. Que los handicap vuelven a salir de la puerta. Uno tiene que aprender el lenguaje de expresiones regulares y entender lo que está haciendo para ajustar el motor de expresiones regulares para no contaminar.

Por ejemplo, tomé tu misma prueba de código C #, ¡pero utilicé un patrón optimizado tuyo y mío y pude bajarlo a 1 milisegundo de manera constante!

La mayoría de las personas aprenden la comparación de patrones básicos haciendo búsquedas con un * . Cuando aprenden regex por primera vez, usan * con el . tales como .* . Ese paso junto con el uso indiscriminado del * probablemente condenará cualquier patrón de no inicio al infierno de retroceso y respuestas lentas.

A menos que sepa empíricamente que no hay elementos, use el + lugar.


En 2009 escribí sobre este tema en mi blog ¿Son las expresiones regulares de C # .Net lo suficientemente rápidas para usted?



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é