在Nokogiri css选择器中指定图像宽度和/或高度的范围



我想使用这个CSS选择器,但我需要选择宽度和/或高度的最小值或最大值或范围,而不是指定图像的精确宽度和高度。我在Ruby中使用Nokogiri宝石,有什么方法可以做到吗?

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}
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 }

我不能给你一个确切的解决方案,但我认为你应该能够通过使用XPath在Nokogiri中做到这一点。

函数库提供最小/最大函数。

已经提供的解决方案包括使用css并使用Ruby过滤结果,或者使用xpath,在那里您可以使用xpath函数来过滤您感兴趣的节点。

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

对于单个查询来说,这样做可能不值得,但如果您经常进行这样的选择,并且您更喜欢css语法而不是使用xpath,那么创建一些这样的自定义类可能是值得的。

最后一件事是,由于css倾向于使用连字符而不是下划线,因此您可能需要为方法创建别名,例如在height_greater_than的定义之后添加alias :"height-greater-than" height_greater_than。然后可以使用更自然的img:height-greater-than(200)作为css选择器。(您也可以使用define_method)。

相关内容

  • 没有找到相关文章