Укажите диапазон ширины и высоты изображения в селекторе Nokogiri css. - PullRequest
1 голос
/ 01 марта 2012

Я хотел бы использовать этот селектор CSS, но вместо того, чтобы указывать ТОЧНУЮ ширину и высоту изображения, мне нужно выбрать минимум или максимум или диапазон для ширины и / или высоты.Я использую драгоценный камень Nokogiri в Ruby, есть ли способ сделать это?

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

Например, ширина> 200 и т. Д ...

Ответы [ 4 ]

4 голосов
/ 01 марта 2012

Я не уверен, что такое 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 голос
/ 01 марта 2012
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 голосов
/ 02 марта 2012

Уже предложенные решения включают либо использование css и фильтрацию результатов с помощью Ruby, либо использование xpath, где вы можете использовать функции xpath для фильтрации интересующих вас узлов.

В Nokogiri есть другая техника, которая может оказаться полезной, вы можете определить свои собственные пользовательские псевдоклассы CSS , которые затем сможете использовать в своих селекторах. Например, вы можете определить псевдокласс height_greater_than, а затем использовать селектор типа img:height_greater_than(200).

Вы делаете это, определяя класс (Ruby) с методами для псевдо (css) классов, которые вы хотите реализовать. Каждый метод должен принять 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 имеет тенденцию использовать дефисы, а не подчеркивания, вы можете захотеть создать псевдонимы для ваших методов, например, добавьте alias :"height-greater-than" height_greater_than после определения height_greater_than. Тогда вы можете использовать более естественный img:height-greater-than(200) в качестве селектора CSS. (Вы также можете использовать define_method).

0 голосов
/ 01 марта 2012

Я не могу дать вам точное решение, но я думаю, что вы сможете сделать это в Нокогири, используя XPath .

Библиотека функций предоставляет функции min / max.

...