如何创建一个nokogiri不区分大小写的Xpath选择器?

我正在使用nokogiri来选择’keywords’属性,如下所示:

puts page.parser.xpath("//meta[@name='keywords']").to_html 

我正在使用的其中一个页面的关键字标签带有大写字母“K”,这促使我使查询不区分大小写。

  AND  

所以,我的问题是:使nokogiri选择案例不敏感的最佳方法是什么?

编辑托马拉克的建议如下,对于这个具体问题非常有用。 我也想用这个例子来帮助更好地理解nokogiri,并且有一些我想知道并且没有成功搜索的问题。 例如,正则表达式’伪类’ Nokogiri Docs是否适合这样的问题?

我也很好奇nokogiri中的匹配?()方法。 我未能找到有关该方法的任何说明。 它与XPath 2.0中的“匹配”概念有什么关系(因此可以用来解决这个问题)吗?

非常感谢。

包含易读性:

 puts page.parser.xpath(" //meta[ translate( @name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz' ) = 'keywords' ] ").to_html 

XPath 1.0中没有“小写”function,所以你必须使用translate()来做这种事情。 根据需要添加重音字母。

Nokogiri允许自定义XPathfunction。 您链接的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这样的属性值的情况下,它将是一个带有单个Nokogiri::XML::Attr的NodeSet。 所以在它上面调用to_s会给你它的价值。 (或者,您可以使用node.value 。)

与使用XPath translate不同,您必须指定每个字符,这适用于Ruby处理的所有字符和字符编码。

另外,如果你对除了XPath 1.0不支持的不区分大小写的匹配之外的其他事情感兴趣,那么它就是Ruby。 所以这是一个很好的起点。