Уже предложенные решения включают либо использование 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
).