Nokogiri позволяет настраивать функции XPath. Документы nokogiri, на которые вы ссылаетесь, показывают встроенное определение класса, когда вы используете его только один раз. Если у вас много пользовательских функций или вы часто используете регистрозависимое соответствие, вы можете определить его в классе.
class XpathFunctions
def case_insensitive_equals(node_set, str_to_match)
node_set.find_all {|node| node.to_s.downcase == str_to_match.to_s.downcase }
end
end
Затем вызовите ее, как любую другую функцию XPath, передав в качестве второго аргумента экземпляр вашего класса.
page.parser.xpath("//meta[case_insensitive_equals(@name,'keywords')]",
XpathFunctions.new).to_html
В вашем методе Ruby node_set
будет привязан к Nokogiri::XML::NodeSet
. В случае, если вы передаете значение атрибута, например @name
, это будет NodeSet с одним Nokogiri::XML::Attr
. Таким образом, вызов to_s
дает вам его ценность. (В качестве альтернативы вы можете использовать node.value
.)
В отличие от использования XPath translate
, где необходимо указывать каждый символ, это работает со всеми символами и кодировками символов, с которыми работает Ruby.
Кроме того, если вам интересно заняться другими делами, помимо сопоставления без учета регистра, которое XPath 1.0 не поддерживает, на данном этапе это просто Ruby. Так что это хорошая отправная точка.