构建HTML Diff / Patch算法

时间:2012-09-29 03:44:25

标签: python html algorithm html-parsing diff

我将要完成的内容的描述:

  • 输入2(N不是必需的)HTML文档。
  • 标准化HTML格式
  • 区分两个文档 - 外部样式并不重要,但将包含内容与文档的内容。
  • 确定HTML块元素级别的增量。

扩展最后一点:

想象一下同一网站的两个页面,它们共享一个侧边栏,可能是一个已被复制/粘贴的共同祖先。每个页面都对侧边栏进行了一些小的更改。差异将揭示这些变化,然后我可以“向上”DOM以找到它们共享的第一个公共块元素,或者只是默认为<body>。在这种情况下,我想把它拿出来发现,哦,他们共享一个共同的<div id="sidebar">

我熟悉DaisyDiff,应用程序类似 - 在CMS世界中。

我也开始玩google diff-patch库了。

我想问一下这种非特定的问题,希望能够征求任何人认为可能有用的建议或指导。目前,如果你把枪放在我的头上并说“CODE IT”我会用Python重写DaisyDiff并加入这个块级逻辑。但我想也许有更好的方法,Anyone have a diff algorithm for rendered HTML?的答案让我感到温暖和模糊。

3 个答案:

答案 0 :(得分:9)

如果您要从头开始,一个有用的搜索词将是“树差异”。

有一篇非常棒的博客文章here,虽然我只是通过谷歌搜索“daisydiff python”,所以我打赌你已经看过了。除了所有有趣的理论内容之外,他还提到了Logilab's 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上efficient diff algorithm for trees and Levenshtein distance的树差异有一些理论上的东西。

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

答案 1 :(得分:1)

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

缺点是你必须清理文档并能够将其作为XML进行解析。

答案 2 :(得分:1)

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

然后你可以选择:

  • 使用prettify将这两种文档呈现为或多或少标准化的HTML和diff这些文档。
  • 比较parse trees

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