Generar html bastante diff en Python

Tengo dos partes de texto que me gustaría comparar y ver qué palabras / líneas se agregaron / eliminaron / modificaron en Python (similar a la salida Diff de un Wiki).

He intentado difflib.HtmlDiff pero su salida es menos que bonita.

¿Hay alguna forma en Python (o biblioteca externa) que genere un HTML de aspecto limpio de la diferencia de dos conjuntos de fragmentos de texto? (no solo nivel de línea, sino también modificaciones de palabra / carácter dentro de una línea)

Hay diff_prettyHtml() en la biblioteca diff-match-patch de Google.

En general, si desea que se genere algo de HTML de una manera más bonita, hágalo agregando CSS.

Por ejemplo, si generas el HTML como este:

 import difflib import sys fromfile = "xxx" tofile = "zzz" fromlines = open(fromfile, 'U').readlines() tolines = open(tofile, 'U').readlines() diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile) sys.stdout.writelines(diff) 

luego obtiene fondos verdes en las líneas agregadas, amarillo en las líneas cambiadas y rojo en las eliminadas. Si estuviera haciendo esto, tomaría el HTML generado, extraería el cuerpo y le pondría un prefijo con mi propio bloque manuscrito de HTML con un montón de CSS para que se vea bien. También es probable que elimine la tabla de leyenda y la mueva a la parte superior o la coloque en un div para que CSS pueda hacer eso.

En realidad, consideraría seriamente la posibilidad de corregir el módulo difflib (que está escrito en python) para generar un mejor HTML y contribuir de nuevo al proyecto. Si tiene un experto en CSS para que lo ayude o es usted mismo, considere hacerlo.

Recientemente publiqué una secuencia de comandos de python que hace esto: diff2HtmlCompare (siga el enlace para una captura de pantalla). Debajo del capó, envuelve difflib y usa piropos para resaltar la syntax.

En primer lugar, intente limpiar ambos códigos HTML por lxml.html, y verifique la diferencia por difflib

Una copia de mi propia respuesta desde aquí .


¿Qué pasa con DaisyDiff ( versiones de Java y PHP disponibles).

Las siguientes características son realmente agradables:

  • Funciona con HTML mal formado que se puede encontrar “en la naturaleza”.
  • La diferencia está más especializada en HTML que en el árbol XML. Cambiar parte de un nodo de texto no hará que se cambie todo el nodo.
  • Además de la diferencia visual predeterminada, la fuente HTML se puede diferenciar de forma coherente.
  • Proporciona descripciones fáciles de entender de los cambios.
  • La GUI predeterminada permite una fácil navegación de las modificaciones a través de atajos de teclado y enlaces.

Dado que la biblioteca de google se ve que ya no tiene un desarrollo activo, sugiero usar diff_py

Desde la página de github:

La herramienta de diferencias simple que está escrita por Python. El resultado de diff se puede imprimir en la consola o en un archivo html.

no solo nivel de línea, sino también modificaciones de palabra / carácter dentro de una línea

xmldiff parece ser un buen paquete para este propósito, especialmente cuando tiene que comparar XML / HTML. Lea más en su documentación .