Générer du html très diff en Python

j'ai deux morceaux de texte que je voudrais comparer et voir quels mots/lignes ont été ajoutés/supprimés/modifiés en Python (similaire à la sortie Diff D'un Wiki).

j'ai essayé difflib.HtmlDiff mais sa sortie est moins que jolie.

y a-t-il un moyen en Python (ou bibliothèque externe) qui générerait du HTML à l'apparence propre de la diff de deux ensembles de morceaux de texte? (pas seulement le niveau de la ligne, mais aussi les modifications de mot/caractère à l'intérieur d'une ligne)

27
demandé sur The Unknown 2009-10-16 10:39:20

6 réponses

il y a diff_prettyHtml() dans la bibliothèque diff-match-patch de Google.

27
répondu tonfa 2017-07-09 23:22:31

en général, si vous voulez qu'un HTML rende plus joli, vous le faites en ajoutant CSS.

par exemple, si vous générez le HTML comme ceci:

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)

puis vous obtenez les fonds verts sur les lignes ajoutées, le jaune sur les lignes changées et le rouge sur supprimé. Si je faisais cela je prendrais prendre le HTML généré, extraire le corps, et le préfixer avec mon propre bloc manuscrit de HTML avec beaucoup de CSS pour le faire paraître bon. Je voudrais aussi probablement enlevez la table de légende et déplacez-la vers le haut ou mettez-la dans une div de sorte que CSS puisse le faire.

en fait, je voudrais sérieusement envisager de simplement réparer le module difflib (qui est écrit en python) pour générer un meilleur HTML et le rendre au projet. Si vous avez un expert CSS pour vous aider ou si vous en êtes un vous-même, s'il vous plaît envisager de le faire.

18
répondu Michael Dillon 2009-10-16 16:40:35

j'ai récemment posté un script python qui fait exactement ceci: diff2HtmlCompare (suivez le lien pour une capture d'écran). Sous le capot il enroule difflib et utilise des pygments pour mettre en évidence la syntaxe.

3
répondu wagoodman 2015-04-25 16:42:34

Une copie de ma propre réponse ici .


à propos DaisyDiff ( Java et PHP des versions disponibles).

les caractéristiques suivantes sont vraiment jolies:

  • Fonctionne avec mal formé HTML qui peut être trouvé dans la "nature".
  • le diffing est plus spécialisé en HTML que l'arbre XML diffère. Changer une partie d'un noeud texte n'entraînera pas de modification de l'ensemble du noeud.
  • en plus de la différence visuelle par défaut, la source HTML peut être diffusée de manière cohérente.
  • fournit des descriptions faciles à comprendre des changements.
  • L'interface graphique par défaut permet de parcourir facilement les modifications à l'aide de raccourcis clavier et de liens.
1
répondu elhoim 2017-05-23 11:47:01

essayez tout d'abord de nettoyer les deux de HTML par lxml.html, et le check la différence par difflib

0
répondu Oduvan 2009-10-16 07:41:41

depuis le .. bibliothèque de google seams pour n'avoir plus de développement actif, je suggère d'utiliser diff_py

à Partir de la page github:

l'outil diff simple qui est écrit par Python. Le résultat diff peut être imprimé en console ou en fichier html.

0
répondu guettli 2016-02-11 11:42:31