2009-10-16 14 views
25

Tengo dos trozos de texto que me gustaría comparar y ver qué palabras/líneas se han agregado/eliminado/modificado en Python (similar a Diff Output de Wiki).Generar bastante html diff en Python

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

¿Existe alguna forma en Python (o biblioteca externa) que genere un aspecto limpio HTML de la diferencia de dos conjuntos de fragmentos de texto? (No sólo a nivel de línea, sino también la palabra/modificaciones de caracteres dentro de una línea)

Respuesta

25

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

+0

El enlace de descarga .zip ahora falla Alguien :(404 –

0

intenta en primer lugar a limpiar tanto de HTML por lxml.html, y el cheque por la diferencia difflib

16

En general, si desea que algo de HTML se represente de una manera más bonita, puede hacerlo agregando CSS.

Por ejemplo, si genera el código HTML siguiente manera:

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) 

entonces obtendrá fondos verdes en las líneas añadidas, amarillas en líneas cambiadas y rojas en eliminada. Si estuviera haciendo esto tomaría tomar el HTML generado, extraer el cuerpo y prefijarlo con mi propio bloque de HTML manuscrito con muchos CSS para que se vea bien. Probablemente también quite la tabla de leyendas y la coloque en la parte superior o la coloque en un div para que CSS pueda hacer eso.

En realidad, me gustaría considerar seriamente arreglar el módulo difflib (que está escrito en python) para generar mejor HTML y contribuirlo de nuevo al proyecto. Si tienes un experto en CSS para ayudarte o eres uno de ellos, considera hacer esto.

+1

implementado su propuesta (como a menudo me encuentro es el caso de Python). HTMLDiff tiene make_table método(), que sólo crea la tabla HTML. Así el usuario puede añadir propio CSS para embellecerlo. En comparación con la respuesta aceptada, esto está incluido (de py 2.4). –

1

Una copia de mi respuesta del here.


¿Qué hay de DaisyDiff (Java y PHP vesions disponibles).

Las siguientes características son muy agradables:

  • Funciona con HTML mal formado que se pueden encontrar "en la naturaleza".
  • La diferenciación es más especializada en HTML que 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 diferir coherentemente.
  • Proporciona descripciones fáciles de entender de los cambios.
  • La GUI predeterminada permite una fácil exploración de las modificaciones a través de atajos de teclado y enlaces.
2

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

0

Desde el ..biblioteca de Google costuras que no tienen un desarrollo activo más, mejor utilizar diff_py

Desde la página de GitHub:

El simple herramienta de diferencias que está escrito por Python. El resultado del diff se puede imprimir en la consola o en el archivo html.