online - parser python example
Construyendo un HTML Diff/Patch Algorithm (3)
Una descripción de lo que voy a lograr:
- Entrada 2 (N no es esencial) documentos HTML.
- Estandarizar el formato HTML.
- Difunda los dos documentos: los estilos externos no son importantes, pero se incluirá cualquier elemento en línea con el documento.
- Determine delta en el nivel Elemento de bloque HTML.
Ampliando el último punto:
Imagine dos páginas del mismo sitio que comparten una barra lateral con lo que probablemente era un ancestro común que se ha copiado / pegado. Cada página tiene algunos cambios menores en la barra lateral. El diff revelará estos cambios, luego puedo "subir" el DOM para encontrar el primer elemento de bloque común compartido por ellos, o simplemente predeterminar a <body>
. En este caso, me gustaría subir y encontrar que, oh, comparten un <div id="sidebar">
común.
Estoy familiarizado con DaisyDiff y la aplicación es similar, en el mundo de CMS.
También he empezado a jugar con la biblioteca de google diff-patch.
Quería hacer este tipo de pregunta no específica para, con suerte, solicitar algún consejo u orientación que alguien piense podría ser útil. Actualmente, si me pones una pistola en la cabeza y me dices "CÓDIGO" reescribiría DaisyDiff en Python y agregaría esta lógica de nivel de bloque. Pero pensé que tal vez hay una mejor manera y que las respuestas a ¿ Alguien tiene un algoritmo de diferencia para HTML renderizado? me hizo sentir cálido y confuso.
Puedes comenzar usando beautifulsoup para analizar ambos documentos.
Entonces tienes una opción:
- use
prettify
para representar ambos documentos como HTML más o menos estandarizado ydiff
esos. - compara los árboles de parse .
Este último le permite, por ejemplo, descartar elementos que solo afectan a la presentación, no al contenido. El primero es probablemente más fácil.
Sé que esta pregunta está relacionada con python, pero podría echarle un vistazo a 3DM - Herramienta de fusión y diferenciación de 3 vías XML (implementación predeterminada en java) pero aquí está el documento que describe el algoritmo utilizado http://www.cs.hut.fi/~ctl/3dm/thesis.pdf , y aquí está el enlace al site .
El inconveniente de esto es que tiene que limpiar el documento y poder analizarlo como XML.
Si fueras a empezar desde cero, un término de búsqueda útil sería "tree diff".
Hay una publicación de blog bastante impresionante here , aunque la encontré en Google "daisydiff python", así que apuesto a que ya la has visto. Además de todas las cosas teóricas interesantes, menciona la existencia del xmldiff
de xmldiff
, un XML de código abierto diferente escrito en Python. Ese podría ser un buen punto de partida, tal vez menos correcto que tratar de envolver o volver a implementar DaisyDiff, pero probablemente sea más fácil ponerse en marcha rápidamente.
También hay html-tree-diff en pypi, que encontré a través de este enlace de Quora: http://www.quora.com/Is-there-any-good-Python-implementation-of-a-tree-diff-algorithm
Hay algunas cuestiones teóricas sobre la diferenciación de árboles en el algoritmo de diferencia eficiente para árboles y la distancia Levenshtein en cstheory.stackexchange.
Por cierto, solo para aclarar, estamos hablando de diferenciar dos árboles DOM, pero no necesariamente renderizando la diferencia / fusión de nuevo en ningún HTML en particular, ¿verdad? (EDICIÓN: Correcto). Muchas de las preguntas con palabras similares aquí están realmente preguntando "¿cómo puedo colorear las líneas borradas en rojo y las líneas agregadas en verde" o "cómo puedo hacer que los párrafos concordantes se alineen visualmente", saltando sobre lo teórico la parte difícil de "cómo diferencio dos árboles DOM en primer lugar" y la parte difícil práctica de "cómo puedo analizar HTML mal formado en un árbol DOM incluso antes de eso". :)