2012-09-29 18 views
18

Una descripción de lo que voy a lograr:HTML Dif/Patch Algoritmo

  • Entrada 2 (N no es esencial) documentos HTML.
  • Estandarizar el formato HTML
  • Diferenciar los dos documentos: los estilos externos no son importantes, pero se incluirá todo lo incluido en el documento.
  • Determine el delta en el nivel de elemento HTML de bloque.

Ampliar el último punto:

imaginar dos páginas del mismo sitio que ambos comparten una barra lateral con lo que probablemente fue un ancestro común que ha sido copiar/pegar. Cada página tiene algunos cambios menores en la barra lateral. El diff revelará estos cambios, luego puedo "acercarme" al DOM para encontrar el primer elemento de bloque común compartido por ellos, o simplemente establecer de manera predeterminada el <body>. En este caso, me gustaría caminar y encontrar que, oh, comparten un <div id="sidebar"> común.

Estoy familiarizado con DaisyDiff y la aplicación es similar, en el mundo CMS.

También he comenzado a jugar con la biblioteca Google diff-patch.

Quería hacer esta clase de pregunta no específica para solicitar algún consejo u orientación que cualquiera piense que podría ser útil. Actualmente, si me pones una pistola en la cabeza y me dices "CÓDIGO", volvería a escribir DaisyDiff en Python y agregaría esta lógica de nivel de bloque. Pero pensé que tal vez había una mejor manera y las respuestas a Anyone have a diff algorithm for rendered HTML? me hicieron sentir cálido y confuso.

+1

Relacionados: http://stackoverflow.com/questions/1576459/generate-pretty-diff-html-in-python. –

+0

No estoy seguro de su aplicación exacta, pero un algoritmo de clasificación DOM es utilizado por proyectos como http://www.readability.com/ para extraer contenido relevante. Si desea diferenciar solo en el núcleo de la página, algo así podría tener sentido –

+0

Me encantaría escuchar una actualización sobre este proyecto; si lograste encontrar lo que estabas buscando y si planeas abrirlo todo :): – onassar

Respuesta

9

Si tuviera que empezar de cero, un término de búsqueda útil sería "tree diff".

Hay una publicación de blog bastante impresionante here, aunque acabo de encontrarla buscando en Google "daisydiff python", así que apuesto a que ya lo has visto. Además de todas las cuestiones teóricas interesantes, menciona la existencia de Logilab's xmldiff, un código abierto XML diferido escrito en Python. Ese podría ser un punto de partida decente, quizás menos correcto que tratar de envolver o volver a implementar DaisyDiff, pero probablemente sea más fácil comenzar a usarlo rápidamente.

También hay html-tree-diff en PyPI, que he encontrado a través de este enlace Quora: http://www.quora.com/Is-there-any-good-Python-implementation-of-a-tree-diff-algorithm

Hay algunas cosas teórica sobre el árbol diffing en efficient diff algorithm for trees and Levenshtein distance en cstheory.stackexchange.

BTW, solo para aclarar, son hablando de la diferenciación de dos árboles DOM, pero no necesariamente haciendo que el diff/merge vuelva a un HTML particular, ¿verdad? (EDITAR: Derecha) Muchas de las preguntas formuladas de forma similar aquí realmente se están preguntando "¿cómo puedo colorear líneas borradas de rojo y líneas verdes añadidas?" O "¿Cómo puedo alinear visualmente los párrafos?", Omitiendo la parte difícil teórica de "cómo diferencio dos árboles DOM en primer lugar" y la parte difícil práctica de "cómo puedo analizar HTML posiblemente malformado en un árbol DOM incluso antes de eso". :)

+0

Eso es correcto. Hay mucho ruido en esta área sobre las personas que quieren representar un diff en HTML de la manera que usted describió. No me importa eso, no presentaré la diferencia en absoluto, sino que usaré los deltas del bloque de elementos de salida para generar visualizaciones más potentes de las diferencias entre las diferentes páginas y versiones de la misma página. Aprecie su aporte, esto no es como todo lo que he construido antes y quería tratar de asegurarme de que no lo estoy pensando o me falta algo obvio. –

1

Sé que esta pregunta está relacionada con Python, pero podría echarle un vistazo 3DM - XML ​​Herramienta de combinación y diferenciación de 3 vías (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í es el enlace al site.

La desventaja de esto es que tiene que limpiar el documento y poder analizarlo como XML.

1

Puede comenzar utilizando beautifulsoup para analizar ambos documentos.

entonces usted tiene una elección:

  • uso prettify para hacer ambos documentos como más o menos estandarizados HTML y los diff.
  • compare el parse trees.

Este último le permite, p. Ej. descartar elementos que solo afectan la presentación, no el contenido. El primero es probablemente más fácil.