18

私が達成しようとしていることの説明:

  • 入力 2 (N は必須ではありません) HTML 文書。
  • HTML 形式を標準化する
  • 2 つのドキュメントを比較します。外部スタイルは重要ではありませんが、ドキュメントにインラインで含まれるものはすべて含まれます。
  • HTML ブロック要素レベルでデルタを決定します。

最後の点を拡張する:

同じサイトの 2 つのページがサイドバーを共有しており、おそらくコピー/貼り付けされた共通の祖先であると想像してください。各ページのサイドバーに若干の変更があります。diff はこれらの変更を明らかにします。次に、DOM を「ウォーク アップ」して、それらが共有する最初の共通ブロック要素を見つけるか、デフォルトで<body>. この場合、私はそれを調べて、共通点を共有していることを見つけたいと思います<div id="sidebar">

私は DaisyDiff に精通しており、アプリケーションも似ています -- CMS の世界では。

また、Google diff-patch ライブラリで遊んでみました。

この種の非具体的な質問をして、誰かが役立つと思われるアドバイスやガイダンスを求めたいと思いました. 現在、あなたが私の頭に銃を向けて「CODE IT」と言った場合、DaisyDiff を Python で書き直して、このブロックレベルのロジックを追加します。しかし、もっと良い方法があるのではないかと思いました暖かくてぼんやりした気分にさせてくれました。

4

3 に答える 3

9

ゼロから始める場合、便利な検索用語は「tree diff」です。

「daisydiff python」をグーグルで見つけたところですが、かなり素晴らしいブログ投稿がここにあります。興味深い理論的な事柄すべてに加えて、彼は、Python で書かれたオープンソースの XMLファイルであるLogilab の存在について言及しています。xmldiffこれは適切な出発点かもしれません — DaisyDiff をラップまたは再実装しようとするよりも正確ではないかもしれませんが、すぐに起動して実行する方がおそらく簡単です。

pypi にはhtml-tree-diffもあります。これは、この Quora リンクから見つけました: http://www.quora.com/Is-there-any-good-Python-implementation-of-a-tree-diff-algorithm

cstheory.stackexchange には、ツリーの効率的な差分アルゴリズムとレーベンシュタイン距離でのツリー差分に関する理論的なものがあります。

ところで、明確にするために、2 つの DOM ツリーを比較することについて話しているのですが、必ずしも特定の HTML に diff/merge を戻す必要はありませんよね? (編集:そうです。)ここでの同様の言葉の質問の多くは、実際には「削除された行を赤くし、追加された行を緑にするにはどうすればよいですか」または「一致する段落を視覚的に並べるにはどうすればよいですか」と尋ねています。 「そもそも2つのDOMツリーを比較するにはどうすればよいか」という難しい部分と、「その前に、不正な形式の可能性のあるHTMLを解析してDOMツリーにする方法」という実際的な難しい部分です。:)

于 2012-10-04T17:24:22.047 に答える
1

まず、 beautifulsoupを使用して両方のドキュメントを解析できます。

次に、選択肢があります。

  • prettify多かれ少なかれ標準化された HTML として両方のドキュメントをレンダリングするために使用しますdiff
  • 構文木を比較してください。

後者を使用すると、たとえば、コンテンツではなくプレゼンテーションにのみ影響する要素を破棄できます。おそらく前者の方が簡単です。

于 2012-10-07T13:15:29.977 に答える
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 に答える