私はそれが簡単な問題だと考えていますの後にパーザがそれを見たのに対してブラウザはJavaScriptとAJAXを持つページを描画し、バックエンドはいくつかの基準に基づいて異なるマークアップを送信しますそれはHTMLにはありません。ここでは、言った
は、私は指紋を生成するために使用したい基本的な考え方です:
スクリプトが異なるページビーイングその結果、異なる可能性があり
require 'digest'
require 'nokogiri'
doc1 = Nokogiri::HTML.parse(<<EOT)
<html>
<head>
<script>
// a script
</script>
</head>
<body>
<div class='foo'><p>content</p></div>
<div class='bar'><p>content</p></div>
</body>
</html>
EOT
doc2 = Nokogiri::HTML.parse(<<EOT)
<html>
<head>
<script>
// a different script
</script>
</head>
<body>
<div class='foo'><p>content</p></div>
<div class='bar'><p>content</p></div>
</body>
</html>
EOT
[doc1, doc2].each { |d| d.search('//text()').remove }
Digest::MD5.hexdigest(doc1.to_html) # => "13215fefd8efe06268574eaa82f4c765"
Digest::MD5.hexdigest(doc2.to_html) # => "13215fefd8efe06268574eaa82f4c765"
:
require 'digest'
require 'nokogiri'
doc1 = Nokogiri::HTML.parse(<<EOT)
<html>
<body>
<div class='foo'><p>content</p></div>
<div class='bar'><p>content</p></div>
</body>
</html>
EOT
doc2 = Nokogiri::HTML.parse(<<EOT)
<html>
<body>
<div class='bar'><p>content</p></div>
<div class='foo'><p>content</p></div>
</body>
</html>
EOT
[doc1, doc2].each { |d| d.search('//text()').remove }
Digest::MD5.hexdigest(doc1.to_html) # => "3abe6e365f145452a5c99a38bfdf2339"
Digest::MD5.hexdigest(doc2.to_html) # => "25c4c66fa90c683cc2d3ce1e7e6a461b"
はにいることを比較しますレンダリングされる。コンテンツを削除するとJavaScriptが取り除かれ、ページが大幅に異なる可能性はありますが、ページは同じであるように見えます。
私はそれを正確かつ確実に行うために唯一の方法は、ブラウザを使用してページをレンダリングし、ページ上のテキストを探すことを可能にするWATIRのようなものを使用することです。
これまでに書いたコードを表示してください。 –
これは簡単ではありません。なぜなら、ブラウザがページをパーサーとは大きく異なる方法で扱うからです。ブラウザは表示用にレンダリングされ、要素はCSSとJavaScriptのために移動することができるので、視覚的に同じものはHTML自体とは大きく異なり、逆も同様です。Nokogiriは生のHTMLを見るので、レイアウトに動的に影響する違いを見つける方法を伝えなければなりません。 WATIRなどのツールを使用すると、レンダリングされたページ内の領域を類似性をチェックすることができます。 –