2016-11-25 4 views
0

同じ情報について〜10のWebサイトを掻き集めており、現在はそれぞれ独自のスクリプトを用意しています。これらのスクリプトはすべて同じベースを持ち(利用可能なページを繰り返し、情報をスクラップして保存します)、属性は異なります。Rubyのスクレイプコードをリファクタリングする(属性が異なる)

例として、これらは、私は2つのページからauthor要素を抽出しています方法の例です:

page.at('b[itemprop="author"]').children.text.strip 
page.at('.author-username').text.strip 

私の目標は、メインロジックは、クラスにによって処理されるので、これをリファクタリングすることですが、私ソースに応じて上記抽出器をどのように渡すかを調べるのに問題があります。私はpass CSS selectors as argumentsができることを認識していますが、各抽出のためのいくつかの追加ロジックがあります。

これを処理する別の方法(前のリンクで概説したように)があるかもしれませんが、これは〜10個のソースですぐに手を出せなくなります。

このコードをリファクタリングする最良の方法は何ですか?

答えて

0

私はおそらくハッシュに行きます。

詳細があまりないとすれば、各ページの関連情報を提供する一種のRosetta Stoneハッシュにすべてを入れてください。関連する詳細をロードするには、case...whenステートメントと組み合わせて使用​​できます。以下のような

何か:あなたは異なる属性の結果に異なるメソッドを呼び出す必要がある場合には、もう少し複雑である必要があり

site_attributes = { 
    site_1: ['attribute_1', 'attribute_2', ... ], 
    site_2: ['attribute_3', 'attribute_4', ... ], 
    ... 
} 

。次に、各サイトの属性配列を文字列の代わりにハッシュする必要があります。

[ 
    { 
    attr: 'attribute_1', 
    methods: [:children, :text, :strip] 
    }, { 
    attr: 'attribute_2', 
    methods: [:text, :strip] 
    }, 
    ... 
] 

が次にあなたが each属性を通じて、 page.at()でそれらを使用して、繰り返しの結果に追加メソッドを呼び出すことができますのようなもの。

+0

回答ありがとうございました。これらの文字列( '['children'、 'text'、 'strip']')を通して提供されるメソッド呼び出しをどうやって行うのか詳しく教えてください。 例として、 'attribute_1.children.text.strip'をどのように実行すればよいですか? – Manonthemoon

+0

ああ、私はそれを理解し、それぞれのメソッドを呼び出すために 'page.send()'を使用しています。 – Manonthemoon

+0

実際、これらのメソッドのリストは、文字列ではなくシンボルである必要があります。どちらも同じように動作するはずですが、シンボルはよりメモリ効率が良いです。 –

関連する問題