18

我将要完成的任务的描述:

  • 输入 2(N 不是必需的)HTML 文档。
  • 标准化 HTML 格式
  • 区分这两个文档——外部样式并不重要,但文档内联的任何内容都将包括在内。
  • 在 HTML 块元素级别确定 delta。

扩展最后一点:

想象一下同一站点的两个页面,它们都与可能是已复制/粘贴的共同祖先共享一个侧边栏。每个页面的侧边栏都有一些小的变化。diff 将显示这些更改,然后我可以“走”DOM 以找到它们共享的第一个公共块元素,或者只是默认为<body>. 在这种情况下,我想走过去发现,哦,他们有一个共同点<div id="sidebar">

我对 DaisyDiff 很熟悉,而且应用程序也很相似——在 CMS 世界中。

我也开始使用 google diff-patch 库。

我想提出这种非特定的问题,希望能征求任何人认为可能有帮助的建议或指导。目前,如果您用枪指着我说“编写代码”,我会用 Python 重写 DaisyDiff 并添加这个块级逻辑。但我想也许有更好的方法和答案任何人都有渲染 HTML 的差异算法?让我感到温暖和模糊。

4

3 回答 3

9

如果您打算从头开始,一个有用的搜索词将是“tree diff”。

这里有一篇非常棒的博客文章,虽然我只是通过谷歌搜索“daisydiff python”找到了它,所以我敢打赌你已经看过了。除了所有有趣的理论内容之外,他还提到了Logilab 的xmldiff存在,这是一种用 Python 编写的开源 XML 不同。这可能是一个不错的起点——可能不如尝试包装或重新实现 DaisyDiff 正确,但可能更容易快速启动和运行。

pypi上还有html-tree-diff,我通过这个 Quora 链接找到了它:http ://www.quora.com/Is-there-any-good-Python-implementation-of-a-tree-diff-algorithm

在 cstheory.stackexchange 上有一些关于树的有效差异算法和 Levenshtein 距离的树差异的理论资料。

顺便说一句,为了澄清一下,您在谈论区分两个 DOM 树,但不一定将 diff/merge 渲染回任何特定的 HTML,对吗?(编辑:对。)这里很多措辞相似的问题实际上是在问“我如何将删除的行涂成红色并将添加的行涂成绿色”或“我怎样才能使匹配的段落在视觉上对齐”,跳过理论“我如何首先区分两个 DOM 树”的困难部分和“我如何在此之前将可能格式错误的 HTML 解析成 DOM 树”的实际困难部分。:)

于 2012-10-04T17:24:22.047 回答
1

我知道这个问题与 python 有关,但您可以查看 3DM - XML 3-way Merging and Differencing Tool(java 中的默认实现),但这里是描述使用的算法的实际论文http://www.cs.hut。 fi/~ctl/3dm/thesis.pdf,这里是该站点的链接。

这样做的缺点是您必须清理文档并能够将其解析为 XML。

于 2012-10-05T19:52:53.993 回答
1

您可以先使用beautifulsoup来解析这两个文档。

然后你有一个选择:

  • 用于prettify将两个文档呈现为或多或少标准化的 HTML 和diff那些。
  • 比较分析树

后者允许您例如丢弃仅影响演示而不影响内容的元素。前者可能更容易。

于 2012-10-07T13:15:29.977 回答