【问题标题】:Generate pretty diff html in Python在 Python 中生成漂亮的 diff html
【发布时间】:2010-12-07 06:45:49
【问题描述】:

我有两段文本,我想比较并查看在 Python 中添加/删除/修改了哪些单词/行(类似于 Wiki 的 Diff 输出)。

我试过 difflib.HtmlDiff 但它的输出并不漂亮。

在 Python(或外部库)中是否有一种方法可以生成两组文本块差异的清晰 HTML? (不仅是行级别,还包括一行内的单词/字符修改)

【问题讨论】:

    标签: python html diff prettify


    【解决方案1】:

    在来自 Google 的 diff-match-patch 库中有 diff_prettyHtml()

    【讨论】:

    • .zip 下载链接现在提供 404 :(
    • 很难判断是否有一种方法可以使用 diff-match-patch 生成良好的多行文件并排差异。似乎主要集中在字符级别的比较上,行级别的文档不是很好(并且示例仅在 JavaScript 中)。
    • 我也觉得它的新家在这里:github.com/google/diff-match-patch
    【解决方案2】:

    通常,如果您希望某些 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 专家来帮助您,或者您自己就是其中之一,请考虑这样做。

    【讨论】:

    • 有人实施了您的提议(我经常发现 Python 就是这种情况)。 HtmlDiff 有 make_table() 方法,它只是创建 HTML 表。所以用户可以添加自己的 CSS 来美化它。与接受的答案相比,包括在内(从 py 2.4 开始)。
    • 不幸的是,difflib.HtmlDiff 生成的 HTML 是一种非常陈旧的表格格式,不太适合使用 CSS 进行自定义。但是,如果您不需要大量自定义,它仍然可以很好地工作。您可能可以更改颜色和字体,但仅此而已。我几乎错过的一个大秘密是构造函数的wrapcolumn 参数,它可以让您防止表格任意宽。
    • 这个过程并排显示整个文件,即使只有一行发生了变化。如果文件很大,这是一个问题。不知道有没有办法解决这个问题
    【解决方案3】:

    我最近发布了一个执行此操作的 python 脚本:diff2HtmlCompare(点击链接获取屏幕截图)。它在底层封装了 difflib 并使用 pygments 进行语法高亮。

    【讨论】:

      【解决方案4】:

      首先尝试通过 lxml.html 清理两个 HTML,然后通过 difflib 检查差异

      【讨论】:

        【解决方案5】:

        由于 .. 来自 google seams 的库不再活跃开发,我建议使用diff_py

        来自github页面:

        由 Python 编写的简单 diff 工具。 diff结果可以打印在控制台或html文件中。

        【讨论】:

          【解决方案6】:

          不仅仅是行级别,还有一行内的单词/字符修改

          xmldiff 似乎是一个很好的包,特别是当你有 XML/HTML 比较时。在他们的documentation 中阅读更多信息。

          【讨论】:

            【解决方案7】:

            我自己来自here的答案的副本。


            DaisyDiff 怎么样(JavaPHP 版本可用)。

            以下功能非常好:

            • 适用于“在野外”可以找到的格式错误的 HTML。
            • HTML 的差异比 XML 树的差异更专业。更改文本节点的一部分不会导致整个节点发生更改。
            • 除了默认的视觉差异之外,还可以连贯地对 HTML 源进行差异。
            • 提供易于理解的更改说明。
            • 默认 GUI 允许通过键盘快捷键和链接轻松浏览修改。

            【讨论】:

            • 这不是与 python 相关的答案。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-02-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-26
            • 2012-01-11
            相关资源
            最近更新 更多