Создание довольно diff html в Python

У меня есть два куска текста, которые я хотел бы сравнить и посмотреть, какие слова/строки были добавлены/удалены/изменены в Python (аналогично выходу Diff Вики).

Я пробовал difflib.HtmlDiff, но это выход меньше, чем довольно.

есть ли способ в Python (или внешней библиотеке), который будет генерировать чистый HTML из двух наборов текстовых фрагментов? (не только уровень строки, но и изменения слов/символов в строке)

6 ответов


здесь diff_prettyHtml() на diff-match-patch библиотеки от Google.


обычно, если вы хотите, чтобы какой-то HTML отображался более красивым способом, вы делаете это, добавляя CSS.

например, если вы создаете HTML следующим образом:

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)

затем вы получаете зеленый фон на добавленных линиях, желтый на измененных линиях и красный на удаленных. Если бы я делал это, я бы взял сгенерированный HTML, извлек тело и префикс его с моим собственным рукописным блоком HTML с большим количеством CSS, чтобы он выглядел хорошо. Я бы также, вероятно, убрал таблицу легенд и переместите его наверх или поместите в div, чтобы CSS мог это сделать.

на самом деле, я бы серьезно рассмотрел просто исправление модуля difflib (который написан на python), чтобы создать лучший HTML и внести его обратно в проект. Если у вас есть эксперт CSS, чтобы помочь вам или сами, пожалуйста, подумайте об этом.


недавно я опубликовал скрипт python, который делает именно это:diff2HtmlCompare (перейдите по ссылке на скриншоте). Под капотом он обертывает difflib и использует pygments для подсветки синтаксиса.


копия моего ответа из здесь.


насчет DaisyDiff (Java и PHP версии доступны).

следующие функции действительно хороши:

  • работает с плохо сформированным HTML, который можно найти "в дикой природе".
  • разница более специализирована в HTML, чем XML-дерево отличается. Меняется часть текста узла не приведет весь узел измененный.
  • в дополнение к визуальному различию по умолчанию, источник HTML может быть различен когерентно.
  • легко понять, описания изменений.
  • GUI по умолчанию позволяет легко просматривать изменения с помощью сочетаний клавиш и ссылок.

попробуйте сначала очистить оба HTML с помощью lxml.html, и проверить разницу по difflib


Так .. библиотека из Google швов, чтобы больше не иметь активной разработки, я предлагаю использовать diff_py

со страницы github:

простой инструмент diff, который написан Python. Результат diff может быть напечатан в консоли или в html-файл.