2012-03-01 20 views
1

我想使用这个CSS选择器,而不是指定图像的EXACT宽度和高度,我需要为宽度选择最小或最大值或范围, /或身高。我在Ruby中使用Nokogiri宝石,有没有办法做到这一点?在Nokogiri css选择器中指定图像宽度和/或高度的范围

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

例如宽度> 200等等

回答

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 2012-03-13 10:40:51

+1

@Bongs不,在这种情况下,您需要下载图像以确定尺寸。 – pguardiario 2012-03-13 10:48:18

0

我不能给你一个确切的解决方案,但我认为你应该能够使用XPath为此在引入nokogiri。

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还有另一种技术可能有用,您可以定义自己的你可以在你的选择器中使用。例如,您可以定义一个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)。