我想使用这个CSS选择器,而不是指定图像的EXACT宽度和高度,我需要为宽度选择最小或最大值或范围, /或身高。我在Ruby中使用Nokogiri宝石,有没有办法做到这一点?在Nokogiri css选择器中指定图像宽度和/或高度的范围
img = doc.css("img[@width = '#{width}'][@height = '#{height}']").collect{|e| e.attributes["src"].value}
例如宽度> 200等等
我想使用这个CSS选择器,而不是指定图像的EXACT宽度和高度,我需要为宽度选择最小或最大值或范围, /或身高。我在Ruby中使用Nokogiri宝石,有没有办法做到这一点?在Nokogiri css选择器中指定图像宽度和/或高度的范围
img = doc.css("img[@width = '#{width}'][@height = '#{height}']").collect{|e| e.attributes["src"].value}
例如宽度> 200等等
我不知道该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}
我不能给你一个确切的解决方案,但我认为你应该能够使用XPath为此在引入nokogiri。
function library提供最小/最大功能。
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 }
已经提供的解决方案涉及使用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
)。
如果图像的宽度/高度属性丢失怎么办?我们仍然可以计算宽度/高度吗? – Bongs 2012-03-13 10:40:51
@Bongs不,在这种情况下,您需要下载图像以确定尺寸。 – pguardiario 2012-03-13 10:48:18