在Python中生成美观的差异HTML

37 投票
7 回答
45327 浏览
提问于 2025-04-15 15:06

我有两段文字,想要比较一下,看看哪些词或行被添加、删除或修改了,类似于维基百科的差异输出。

我试过使用 difflib.HtmlDiff,但它生成的结果看起来不太好。

有没有什么方法可以在 Python 中(或者用外部库)生成干净漂亮的 HTML 格式的文本差异?(不仅仅是按行比较,还要能显示行内的词或字符的修改)

7 个回答

6

我最近发布了一个Python脚本,正好可以做到这一点:diff2HtmlCompare(点击链接可以查看截图)。这个脚本的内部使用了一个叫做difflib的工具,并且用pygments来给代码上色,让它看起来更好看。

26

一般来说,如果你想让一些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方面的专家帮忙,或者你自己就是专家,请考虑这样做。

34

在谷歌的diff-match-patch库里,有一个叫做diff_prettyHtml()的功能。

撰写回答