2016-04-11 17 views
0

私はWebスクレーパーで作業しています。ページにはいくつかのバリエーションがあり、プログラムはそれぞれ異なる方法で動作するはずです。ページ上の内容に応じてページを処理する方法を変更する必要があります。私は入れ子にすることができますifRubyが適切な構造の場合

if str=data.css('div#imgTag').to_s 
    str.delete('@') 
    #do something 
elsif str=data.css('span#Title').to_s 
    #do something else 
elseif str=data.css('span#block').to_s 
    #do something 
end 

return str 

上記のコードは、常に動作しません。私には欠陥があると思います。私はそれに対処するより良い方法を探しています。私はよりエレガントな、建設を探しています。

+0

あなたがここに間違えているelseif' noキーワードが '存在しませんか? –

+0

'str = ...'または 'str == ...'? – Aetherus

+2

'to_s'は常に文字列、つまり* truthy *値を返します。したがって、あなたの 'elsif'は決して到達されません。 – Stefan

答えて

4

あなたが代わりにifcase whenを使用することができ、あなたのいくつかのIFSは、同じ変数についてあるとき、それはより実用的である:http://www.techotopia.com/index.php/The_Ruby_case_Statement

そうでなければ、私は本当にあなたがより良い何ができるかわかりません。プログラムのコンテキストと動作しないことの詳細を追加する必要があります。

EDIT:@Aetherusはコメントの中で、==の代わりに=を使用して比較しています。これは、テストする代わりに変数に値を割り当てているため、常にtrueです。

EDIT AGAIN:@Stefanにもポイントがあります。 data.css()がnilを返す場合、to_sは常に真である空の文字列を返します。 try(:to_s)を使用して、nilオブジェクト(http://www.rubydoc.info/docs/rails/Object%3Atry)で呼び出された場合はnilを返すことができます。

あなたのコードは次のようになります。

case str 
    when data.css('div#imgTag').try(:to_s) 
    str.delete('@') 
    #do something 
    when data.css('span#Title').try(:to_s) 
    #do something else 
    when data.css('span#block').try(:to_s) 
    #do something 
end 

return str 
+0

華麗な、ありがとう! – AKarpun

関連する問題