2017-03-02 4 views
0

私はDSL経由でページをスクラップする方法を定義できるWebスクレーパーを構築しようとしています。最初にツリー(バイナリツリーではない)がコンパイルされ、そのツリーがページをスクレープするために使用されます。ツリー構造を構築して奇妙な複製問題を取得する

問題は、3回呼び出されるフィールドを追加するコードブロックにもかかわらず、いくつかの奇妙な重複の問題が発生しています。何とかフィールドがすべてのノードに追加されています(そのうちの5つです)。どうやってこれが起こっているのか分からないので、スタックに頼むと思った。

重要なコードはhereです。ターミナル出力を.jsonに設定すると読みやすくなります。

編集:私はハッシュのobject_idsで見てきた

Nodeオブジェクト内のコンテナハッシュ(@data)が異なるIDを持っていますが、コンテナのハッシュ内部fieldsハッシュがすべて同じIDを共有しているように見えます更新すると、他のものを更新します。

私は最初のツリーノードに渡したinitハッシュを(今クローンして)複製しているので、なぜそれが起こっているのか分かりません。なぜ同じハッシュオブジェクトを参照しているのですか?

+0

ええ、こんにちは、これを閉じるのに投票した人ですか?ヘルプセンターの範囲によると、これは非常にトピックです。たとえ問題が正確ではない場合でも(特定の問題がどこにあるか分かりません)、出力が含まれていて、それを絞っているので、トピックには間違いありません。ダウン。あなたがOPを正しく読むのに気を使うことができないならば、罰金をかけて結果として閉じないようにすると、あなたは馬鹿に見えます。 – Thermatix

答えて

0

は[OK]を、それが今、本質的の新しいコピーを作成し、それが追加されるたびに持っているので、私は@dataコンテナ内の項目を設定メカニズムを変更しなければならなかった問題を解決するために今、それは次のようになります。

def set_info(type,name,xpath,meta) 
    #see, I have to grab the current hash then merge the new data into it and then overwrite the old hash with the new one :(
    @tree[@tree_pointer].data[type] = @tree[@tree_pointer].data[type].merge({name => { 
    xpath: join_xpath(xpath), 
    meta: meta 
    }}) 
end 

確かに理想的ではありませんが、ルビが参照のコピーを停止し、実際に別のハッシュオブジェクトを作成する唯一の方法でしたが、複製の問題は解消されました。

まだ誰かがこれを行うためのより良い方法を持っている場合、私はすべての耳です。

関連する問題