2012-09-29 49 views
18

什麼我要完成的描述:構建一個HTML比較/補丁算法

  • 輸入2(N不是必需的)HTML文檔。
  • 標準化HTML格式
  • 比較兩個文檔 - 外部樣式並不重要,但包含任何內嵌到文檔的內容。
  • 確定HTML塊元素級別的增量。

擴大的最後一點:

想象的同一部位的兩個頁面,這兩個份額什麼可能是一個共同的祖先已經複製/粘貼一個側邊欄。每個頁面都有一些對側邊欄的小改動。差異會揭示這些變化,然後我可以「走上」DOM找到它們共享的第一個公共塊元素,或者只是默認爲<body>。在這種情況下,我想走一遍,發現它們共享一個共同的<div id="sidebar">

我對DaisyDiff很熟悉,應用程序類似 - 在CMS世界中。

我也開始玩谷歌diff-patch庫。

我想問一下這種非特定的問題,希望能夠徵求任何人認爲可能有用的建議或指導。目前,如果你把槍放在我的頭上,並說「CODE IT」,我會用Python重寫DaisyDiff,並插入這個塊級邏輯。但我想也許有更好的辦法,Anyone have a diff algorithm for rendered HTML?的答案讓我感到溫暖和模糊。

+1

相關:http://stackoverflow.com/questions/1576459/generate-pretty-diff-html-in-python。 –

+0

我不確定您的具體應用,但像http://www.readability.com/這樣的項目使用DOM排名算法來提取相關內容。如果你只想在頁面的核心上進行區分,那麼這樣做可能是有意義的 –

+0

希望聽到關於這個項目的更新;如果你設法找到你要找的東西,並且如果你計劃開放它的任何東西:) – onassar

回答

9

如果你打算從頭開始,一個有用的搜索詞將是「樹差異」。

有一個非常棒的博客文章here,雖然我剛剛通過Google搜索「daisydiff python」找到它,所以我敢打賭你已經看到了它。除了所有有趣的理論內容外,他還提到了Logilab's xmldiff的存在,這是一種用Python編寫的開源XML差異。這可能是一個不錯的起點 - 也許比試圖包裝或重新實現DaisyDiff更不正確,但可能更容易快速啓動和運行。

還有html-tree-diff PyPI上,這是我通過這個鏈接Quora的發現:http://www.quora.com/Is-there-any-good-Python-implementation-of-a-tree-diff-algorithm

有一個關於樹的一些理論的東西在efficient diff algorithm for trees and Levenshtein distance上cstheory.stackexchange版本比較。

順便說一句,只是爲了澄清,你談論差異兩個DOM樹,但不一定渲染差異/合併回到任何特定的HTML,對不對? (編輯:對)這裏有很多類似問題的問題真的在問:「我怎樣才能將刪除的線條變成紅色並增加線條綠色」或「我怎樣才能讓匹配的段落直觀地排列起來」,跳過右邊的「我如何區分兩個DOM樹」這一理論難題,以及「在這之前我如何將可能格式錯誤的HTML解析爲DOM樹」這一實際難題。 :)

+0

這是正確的 - 這個區域有很多人想要用你描述的方式呈現HTML中的差異。我不在乎,我不會渲染差異,而是使用輸出塊元素變化來驅動不同頁面和版本之間差異的更強大的可視化。欣賞你的投入,這不像我之前建立的任何東西,我想盡力確保我沒有想到它或錯過任何明顯的東西。 –

1

我知道這個問題與python有關,但你可以看看3DM-XML 3路合併和差異工具(在java中的默認實現),但這裏是描述算法的實際論文http://www.cs.hut.fi/~ctl/3dm/thesis.pdf,這裏是鏈接到site

缺點是您必須清理文檔並能夠將其解析爲XML。

1

您可以先使用beautifulsoup解析這兩個文檔。

然後你有一個選擇:

  • 使用prettify呈現兩個文檔或多或少標準化HTML和diff那些。
  • 比較parse trees

後者允許你例如丟棄僅影響演示文稿的元素,而不是內容。前者可能更容易。