2012-03-01 4 views

答えて

4

私はself.bodyがすべてに約あるかはよく分からないが、あなたがそうのような幅でのimgのを選択することができます。

doc.css('img').select{|img| img[:width].to_i > 200} 

または

doc.css('img').select{|img| (200..300).include? img[:width].to_i} 
+1

画像の幅/高さ属性がない場合はどうなりますか?それでも幅と高さを計算できますか? – Bongs

+1

@Bongsいいえ、その場合は、画像をダウンロードして寸法を決定する必要があります。 – pguardiario

0

については

img = doc.css("img[@width = '#{width}'][@height = '#{height}']").collect{|e| e.attributes["src"].value} 

私はあなたの厳密解を与えるcan't、私はあなたがXPathを使って、鋸山でこれを行うことができるはずだと思います。

function libraryは、最小/最大機能を提供します。

1
doc.xpath('//img[@width > 200]/@src').map {|a| a.value } 

または

doc.xpath('//img[@height >= 50 and @height <= 300 and @width >= 50 and @width <= 300]/@src').map {|a| a.value } 
0

既に提供されているソリューションには、 cssを使用してRubyで結果をフィルタリングするか、xpath関数を使用して関心のあるノードをフィルタリングするxpathを使用します。

Nokogiriには別の手法があります。 custom css pseudo classesを選択して使用することができます。たとえば、height_greater_than疑似クラスを定義し、img:height_greater_than(200)のようなセレクタを使用できます。

これは、実装したい擬似(css)クラスのメソッドで(Ruby)クラスを定義することで行います。それぞれのメソッドは、最初の引数としてNodeSetを受け取り、次にcssから渡す引数を取ります。

class CustomPsuedoSelectors 
    def height_greater_than(nodes, height) 
    nodes.find_all {|n| n['height'].to_i > height} 
    end 
end 

次はcssへの呼び出しの引数として、このクラスのインスタンスを渡します。これは、単一のクエリのためにこれをやって価値がないかもしれません

nodes = doc.css 'img:height_greater_than(200)', CustomPsuedoSelectors.new 

が、あなたのような選択を行っている場合これはたくさんあり、xpathを使用するよりもCSS構文を好む場合は、このようなカスタムクラスを作成する価値があります。

最後に、cssはアンダースコアではなくハイフンを使用する傾向があるため、メソッドのエイリアスを作成することができます。 height_greater_thanの定義の後にalias :"height-greater-than" height_greater_thanを追加します。その後、より自然なimg:height-greater-than(200)をCSSセレクターとして使用することができます。 (define_methodも使用できます)。

関連する問題