¿Existe algún documento / tesis / investigación que demuestre que RegEx no debe usarse para el análisis HTML y que en su lugar debe usarse un analizador XML?

Todo este meme cthulhu-never-parse-xml-with-regex tiene que morir. Gritar no te hace bien. Jurar no te hace bien. Incluso usar unicode para hacer que tu texto se vea extraño no te hace correcto.

Este meme es técnicamente correcto pero básicamente está mal. Es técnicamente correcto en el sentido de que una única expresión regular clásica no es capaz de reconocer el conjunto de documentos XML válidos. Pero decir que, por lo tanto, “no puede analizar xml con expresiones regulares” es como decir que “no puede hacer estallar las cosas con dinamita”, porque la dinamita, después de todo, no se encenderá sin un fósforo, y necesita el oxígeno del aire para alimenta la combustión: es una pedantería irritante.

Entonces, solo para dejar las cosas claras:

1) Los analizadores usan expresiones regulares. Los analizadores suelen estar formados por dos componentes: un escáner escrito como una expresión regular y un analizador escrito como una gramática libre de contexto. Si has oído hablar de las herramientas de Unix lexx y yacc, bueno, la primera es para escribir escáneres y la segunda es para escribir analizadores. Lexx es solo una herramienta elegante para escribir expresiones regulares.

De hecho, es bastante inusual encontrar * any * parser que * no * usa expresiones regulares. La biblioteca del combinador Haskell Parsec le permite combinar el lexing y el análisis en uno; y los analizadores Packrat no requieren una fase de escaneo separada. Casi todo lo demás usa expresiones regulares (o máquinas de estado finito escritas a mano).

2) Los analizadores HTML usan expresiones regulares. El código fuente del analizador HTML de Python está aquí: http://hg.python.org/cpython/fil…

Echa un vistazo a las líneas 16-65. Nada más que expresiones regulares. El analizador de Python, como la mayoría de los analizadores para HTML, SGML o XML, depende completamente de la expresión regular. Acabo de revisar varios analizadores similares, algunos de los de bajo nivel como Xerces o expat no usan bibliotecas de expresiones regulares, pero todavía tienen fases de escáner con sus características máquinas de estados finitos.

Entonces, decir “no use expresiones regulares para analizar HTML; en su lugar, use un analizador sintético” es como decir “no use un motor para viajar largas distancias; pruebe con un automóvil”. Tonterías ignorantes.

3) De hecho, la fase de escaneo es prácticamente todo lo que hay para analizar HTML. En un lenguaje como, por ejemplo, C, el analizador de gramática a menudo será mucho más complicado que el escáner. Esto se debe a que debe tratar con todos los patrones estructurales anidados complejos de C: debe saber qué “otro” pertenece a qué “si”, cuándo x * * y es una declaración y cuándo es multiplicación y desreferencia, y así sucesivamente. HTML no tiene ese tipo de complejidad estructural. Básicamente son solo etiquetas dentro de las etiquetas. De hecho, los analizadores XML o HTML a menudo funcionan en modo SAX, que en realidad es solo un escáner. El analizador gramatical para HTML, cuya complejidad canosa supuestamente impide que alguien analice HTML con una expresión regular, literalmente podría escribirse como una breve declaración de cambio dentro de un ciclo while.

La verdadera razón por la que no debe usar una expresión regular para analizar XML es que XML es una abominación demasiado complicada, cuyo procesamiento correcto es imposible sin una gran cantidad de código. Un procesador XML correcto tiene que manejar espacios de nombres, referencias de entidades, codificaciones, CDATA, instrucciones de procesamiento y un sinfín de cosas de las que nunca has oído hablar y que no te importan.

HTML, por el contrario, tiene un estándar de facto de “lo que funcionará en al menos los navegadores más dominantes”, y en la práctica puede analizarlo con expresiones regulares, y en la práctica todos lo hacen.

Finalmente, me gustaría decir que no siempre confíe en la sabiduría convencional del programador o en la multitud en StackOverflow. Es el equivalente digital de mierda alrededor del enfriador de agua. (Lo mismo ocurre con Quora).

Si está buscando analizar HTML con expresiones regulares, miraría el analizador de python que publiqué anteriormente, o el que está aquí: https://github.com/tautologistic… o simplemente mire a su alrededor. La teoría se explica en libros como “Introducción a la teoría de autómatas, lenguaje y computación”, pero probablemente sea mucho más esfuerzo tratar de aprender todo eso que comprender un simple analizador basado en expresiones regulares.

Siempre que su HTML esté bien formado, debería poder hackear algunas expresiones regulares y analizar un documento HTML sin ningún problema.

Sin embargo, cuando eliminas las advertencias anteriores, las razones por las que no deberías usar expresiones regulares para esto son prácticas, no académicas.

En general, el HTML que necesitará analizar será de múltiples versiones HTML y es posible que no esté bien formado. Sin embargo, todavía existe la expectativa de que el documento se pueda presentar, por lo que los analizadores deben manejar muchos casos de esquina para trabajar con HTML mal formado.

Mientras su profesor controle la entrada y no lo asalte con un montón de HTML roto en varias versiones, no debería haber ningún problema al aplicar expresiones regulares a sus tareas de clase. No me pondría en contacto con el decano de su departamento exigiendo un cambio en el plan de estudios sobre esto.

Sospecho que su profesor asume que la mayoría de los estudiantes tienen suficiente conocimiento de HTML para poder construir analizadores para él usando expresiones regulares, y prefiere usar HTML para evitar enseñarle Lisp o algún lenguaje de juguete para que trabaje. Supongo que si escucho la historia completa de por qué has estado analizando HTML con expresiones regulares en clase, mi reacción sería: “los niños en estos días lo tienen tan fácil”.

En la práctica, cuando trabaje con documentos HTML arbitrarios, debería considerar analizar el HTML en un DOM y consultar con los selectores XPath o CSS. Prefiero Selenium Webdriver para esto. Puede parecer excesivo, pero los analizadores en Firefox y Webkit son de última generación, y si la página se actualiza a través de llamadas AJAX después de cargar el documento, las actualizaciones serán consultables a través del DOM, todo sin necesidad de escribir un regex simple

Las expresiones regulares son básicamente máquinas de estados finitos. Esto significa que no están en Turing Completo y tienen ciertas limitaciones (como no poder detectar si las etiquetas se cerraron y / o anidaron correctamente). Por lo tanto, una expresión regular por sí sola no será suficiente.

La teoría altamente recomendada detrás de estas cosas es el libro de Michael Sipser: http://www-math.mit.edu/~sipser/

Eso no significa que una expresión regular no tenga sus méritos para cosas simples ad-hoc. Simplemente no construyas un navegador basado en él.

More Interesting

¿Cuáles son algunos temas interesantes en informática?

¿Qué área de investigación debo elegir? Tengo opciones entre "Semántica de lenguajes de programación" y "Algoritmos y criptografía" de investigación para mi tesis de maestría, y estoy extremadamente confundido en las circunstancias.

¿Fue Rijndael / AES el más fuerte de los candidatos históricos de AES? ¿Por qué o por qué no?

¿Cuáles son los trabajos de investigación que un graduado de CS debería haber leído antes de seguir una carrera como desarrollador de software?

¿Qué documentos debo leer para interesarme en la investigación en informática?

¿Cómo es la práctica en CERN Openlabs?

¿Hay algún algoritmo en línea para la reducción de dimensionalidad no lineal?

¿Se puede usar Matlab Computer vision para productos a gran escala?

¿Cuáles son los mejores trabajos académicos en informática? ¿Por qué?

¿Es la computación en el espacio diferente de la computación en la tierra?

¿Cómo proceder si tengo la intención de investigar en Ciencias de la Computación pero de una escuela de posgrado promedio donde la investigación es inexistente incluso para los profesores?

¿Cuál es el SDLC que se sigue para los proyectos de investigación?

¿Por qué no hay más personas trabajando para mejorar la inteligencia artificial?

¿Cuáles son los temas candentes que se pueden investigar sobre la construcción del compilador?

¿Cómo es investigar en el Instituto Nacional de Informática (NII) de Japón?