2009-10-16 4 views
25

Ho due blocchi di testo che vorrei confrontare e vedere quali parole/linee sono state aggiunte/rimosse/modificate in Python (simile all'Output di un Wiki).Genera piuttosto diff html in Python

Ho provato difflib.HtmlDiff ma il suo output è inferiore alla bella.

C'è un modo in Python (o in una libreria esterna) che generi HTML in grado di distinguere il diff di due serie di blocchi di testo? (Non solo a livello di linea, ma anche la parola/modifiche di carattere all'interno di una riga)

risposta

25

C'è diff_prettyHtml() nel diff-match-patch libreria da Google.

+0

Il link per il download .zip ora dà una Qualcuno 404 :( –

0

tentano prima di tutto Clean Up entrambi HTML lxml.html, e verificare la differenza da difflib

16

In genere, se si desidera che l'HTML esegua il rendering in modo più grazioso, lo si fa aggiungendo CSS.

Per esempio, se si genera il codice HTML in questo modo:

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) 

poi si arriva sfondi verdi su linee aggiunte, giallo sulle linee modificate e rosso su cancellato. Se lo facessi, prenderei l'HTML generato, estrai il corpo e lo prefisso con il mio blocco HTML scritto a mano con un sacco di CSS per farlo sembrare buono. Probabilmente avrei anche rimosso il tavolo delle leggende e spostato verso l'alto o inserito in un div in modo che i CSS possano farlo.

In realtà, prenderei seriamente in considerazione il semplice aggiustamento del modulo difflib (che è scritto in python) per generare un HTML migliore e contribuirlo al progetto. Se hai un esperto di CSS per aiutarti o sei uno, per favore considera di farlo.

+1

implementata la vostra proposta (come spesso mi trovo è il caso con Python). HTMLDiff ha metodo make_table(), che crea solo la tabella HTML. Così l'utente può aggiungere possedere CSS per migliorarlo. Rispetto alla risposta accettata, questo è incluso (da py 2.4). –

1

Una copia della mia risposta da here.


Che dire DaisyDiff (Java e PHP vesions disponibili).

Le seguenti caratteristiche sono veramente bello:

  • Funziona con HTML mal formato che possono essere trovati "in the wild".
  • La differenza è più specializzata in HTML rispetto a quella dell'albero XML. La modifica di parte di un nodo di testo non causerà la modifica dell'intero nodo.
  • Oltre alla differenza visiva predefinita, la sorgente HTML può essere diffusa in modo coerente.
  • Fornisce descrizioni facili da comprendere delle modifiche.
  • La GUI predefinita consente una facile navigazione delle modifiche tramite scorciatoie da tastiera e collegamenti.
2

Recentemente ho pubblicato uno script Python che fa proprio questo: diff2HtmlCompare (segui il link per uno screenshot). Sotto la cappa avvolge difflib e usa i picchi per l'evidenziazione della sintassi.

0

Dal momento che il ..libreria da google cuciture a non avere sviluppo attivo più, vi consiglio di usare diff_py

Dalla pagina GitHub:

La semplice strumento diff che è scritto da Python. Il risultato diff può essere stampato in console o in un file html.