【发布时间】:2010-12-07 06:45:49
【问题描述】:
我有两段文本,我想比较并查看在 Python 中添加/删除/修改了哪些单词/行(类似于 Wiki 的 Diff 输出)。
我试过 difflib.HtmlDiff 但它的输出并不漂亮。
在 Python(或外部库)中是否有一种方法可以生成两组文本块差异的清晰 HTML? (不仅是行级别,还包括一行内的单词/字符修改)
【问题讨论】:
我有两段文本,我想比较并查看在 Python 中添加/删除/修改了哪些单词/行(类似于 Wiki 的 Diff 输出)。
我试过 difflib.HtmlDiff 但它的输出并不漂亮。
在 Python(或外部库)中是否有一种方法可以生成两组文本块差异的清晰 HTML? (不仅是行级别,还包括一行内的单词/字符修改)
【问题讨论】:
在来自 Google 的 diff-match-patch 库中有 diff_prettyHtml()。
【讨论】:
通常,如果您希望某些 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,提取正文,并在其前面加上我自己手写的带有大量 CSS 的 HTML 块,以使其看起来不错。我也可能会删除图例表并将其移至顶部或将其放在 div 中,以便 CSS 可以做到这一点。
实际上,我会认真考虑修复 difflib 模块(它是用 python 编写的)以生成更好的 HTML 并将其回馈给项目。如果您有 CSS 专家来帮助您,或者您自己就是其中之一,请考虑这样做。
【讨论】:
difflib.HtmlDiff 生成的 HTML 是一种非常陈旧的表格格式,不太适合使用 CSS 进行自定义。但是,如果您不需要大量自定义,它仍然可以很好地工作。您可能可以更改颜色和字体,但仅此而已。我几乎错过的一个大秘密是构造函数的wrapcolumn 参数,它可以让您防止表格任意宽。
我最近发布了一个执行此操作的 python 脚本:diff2HtmlCompare(点击链接获取屏幕截图)。它在底层封装了 difflib 并使用 pygments 进行语法高亮。
【讨论】:
首先尝试通过 lxml.html 清理两个 HTML,然后通过 difflib 检查差异
【讨论】:
由于 .. 来自 google seams 的库不再活跃开发,我建议使用diff_py
来自github页面:
由 Python 编写的简单 diff 工具。 diff结果可以打印在控制台或html文件中。
【讨论】:
不仅仅是行级别,还有一行内的单词/字符修改
xmldiff 似乎是一个很好的包,特别是当你有 XML/HTML 比较时。在他们的documentation 中阅读更多信息。
【讨论】: