2017-09-04 18 views
0

Nokogiriを使用して画像URLを抽出しようとしています。 以下のコードは動作しますが、elsifを無限に実行するのではなく、より効率的でスケーラブルな方法で作業したいと思います。動的属性名に一致する

if doc.at_css("img[itemprop='image']")['src'] 
    img = doc.at_css("img[itemprop='image']")['src'] 
elsif doc.at_css("img[itemprop='image']")['data-src'] 
    img = doc.at_css("img[itemprop='image']")['data-src'] 
elsif doc.at_css("img[itemprop='image']")['data-react-src'] 
    img = doc.at_css("img[itemprop='image']")['data-react-src'] 
... 

私は両方のアプローチを学ぶしたいと思います:

1)平野Rubyの道を:反復は、[ 'SRC'、 'データ-SRC' のような名前を属性と同じように、 'データ・反応するSRC'、等...]

2)鋸山の正規表現またはXPathの、アプローチ:

'SRC' || 'data-src' || 'データ・反応-SRC

このような:

さらに良い
doc.at_css("img[itemprop='image']")['src' || 'data-src' || 'data-react-src] 

、店は変数に属性名:

my_attributes = [' SRCを」|| 'data-src' || 「データ反応-SRC] doc.at_css( "IMG [にitemprop = '画像']")[my_attributes]

3)

答えて

1

これを試す前のものよりも効率的なアプローチがある場合:

attributes = %w[src data-src data-react-src] 
elem = doc.at_css("img[itemprop='image']") 
attr = attributes.find { |attr| elem[attr] } 
doc[attr] if attr 

それは何:

  1. は、静的および動的属性のリストを保持します。今後さらに追加してください。リストの順序は重要です[ref#3]
  2. elemは要素(Nokogiri::XML::Element)を保持します。最適化するために複数回フェッチしたくありません。
  3. attrは、最初の属性を保持します。この要素のうち、は、に応答します。 srcが見つかった場合は、data-srcなどで検索しようとしません。このようにして、反復を最適化しました。
  4. 属性が利用可能であれば、attr ibuteの値を返します。

希望します。

関連する問題