我正在使用 nokogiri 来选择“关键字”属性,如下所示:
puts page.parser.xpath("//meta[@name='keywords']").to_html
我正在使用的其中一个页面的关键字标签带有大写字母“K”,这促使我使查询不区分大小写。
<meta name="keywords"> AND <meta name="Keywords">
所以,我的问题是:使 nokogiri 选择不区分大小写的最佳方法是什么?
编辑 下面 Tomalak 的建议非常适合这个特定问题。我还想使用这个例子来帮助更好地理解 nokogiri,并且有几个我想知道但没有成功搜索的问题。例如,正则表达式“伪类”是Nokogiri Docs吗?适合这样的问题吗?
我也很好奇 nokogiri 中的 matches?() 方法。我无法找到有关该方法的任何说明。它与 XPath 2.0 中的“匹配”概念有什么关系吗(因此它可以用来解决这个问题)?
非常感谢。
最佳答案
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
将绑定(bind)到 Nokogiri::XML::NodeSet
。如果您传递的是 @name
之类的属性值,它将是一个具有单个 Nokogiri::XML::Attr
的 NodeSet。所以在它上面调用 to_s
给你它的值。 (或者,您可以使用 node.value
。)
与使用必须指定每个字符的 XPath translate
不同,这适用于 Ruby 处理的所有字符和字符编码。
此外,如果您有兴趣做除 XPath 1.0 不支持的不区分大小写的匹配之外的其他事情,那么此时只有 Ruby。所以这是一个很好的起点。
关于ruby - 如何创建 nokogiri 不区分大小写的 Xpath 选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2279513/