2009-10-16 8 views
25

Mam dwie porcje tekstu, które chciałbym porównać i zobaczyć, które słowa/linie zostały dodane/usunięte/zmodyfikowane w Pythonie (podobnie jak wyjście Diff Wiki).Wygeneruj dość diff html w Pythonie

Próbowałem difflib.HtmlDiff, ale jego wynik jest mniej niż ładne.

Czy istnieje sposób w Pythonie (lub bibliotece zewnętrznej), który wygenerowałby czysty wygląd kodu różniczkowego dwóch zestawów fragmentów tekstu? (Nie tylko o poziomie liniowym, ale także słowo/modyfikacje charakter w linii)

Odpowiedz

25

Jest diff_prettyHtml() w diff-match-patch biblioteka od Google.

+0

.zip link do pobrania teraz daje 404 :( –

0

próbują przede wszystkim oczyścić zarówno HTML przez lxml.html i sprawdzić różnicę przez difflib

16

Ogólnie rzecz biorąc, jeśli chcesz, aby HTML był renderowany w ładniejszy sposób, robisz to, dodając CSS.

Na przykład, jeśli generować kod HTML tak:

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) 

następnie dostać zielone tło na dodanych linii, żółte na zmienionych linii i czerwony na usunięta. Gdybym to robił, wziąłbym wygenerowany kod HTML, wyodrębniłbym ciało i przedrostek go własnoręcznym blokiem HTML z mnóstwem CSS, aby wyglądał dobrze. Prawdopodobnie usunę też tabelę legendy i przesunę ją na szczyt lub umieść w div, aby CSS mógł to zrobić.

Właściwie poważnie rozważałbym właśnie poprawienie modułu difflib (który jest napisany w pythonie), aby wygenerować lepszy HTML i wnieść go z powrotem do projektu. Jeśli masz eksperta CSS, który Ci pomoże lub sam nim jesteś, pomyśl o zrobieniu tego.

+1

Ktoś realizowane propozycji (jak często ma to miejsce w przypadku Pythona). HtmlDiff ma metodę make_table(), która właśnie tworzy tabelę HTML. Tak więc użytkownik może dodać własny kod CSS, aby go upiększyć, w porównaniu z zaakceptowaną odpowiedzią (od wersji 2.4). –

1

Kopię mojej odpowiedzi z here.


Co DaisyDiff (Java i PHP vesions dostępny).

następujące funkcje są naprawdę ładne:

  • Działa z źle utworzonego HTML, które można znaleźć „na dziko”.
  • Rozróżnienie jest bardziej wyspecjalizowane w HTML niż drzewo XML różni się. Zmiana części węzła tekstowego nie spowoduje zmiany całego węzła.
  • Oprócz domyślnego porównania wizualnego źródło HTML może być spójnie rozdzielone.
  • Zawiera łatwe do zrozumienia opisy zmian.
  • Domyślny GUI umożliwia łatwe przeglądanie modyfikacji za pomocą skrótów klawiaturowych i łączy.
2

Niedawno opublikowałem skrypt Pythona, który robi właśnie to: diff2HtmlCompare (kliknij link do zrzutu ekranu). Pod maską owija się difflib i wykorzystuje kredki do podświetlania składni.

0

Od czasu ..biblioteka z google szwach nie mieć aktywny rozwój więcej, proponuję użyć diff_py

Na stronie github:

Proste narzędzie diff, który został napisany przez Pythona. Wynik porównania można wydrukować w konsoli lub w pliku HTML.