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

标签 ruby xpath nokogiri

我正在使用 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/

相关文章:

ruby - 404 未找到,但可以从网络浏览器正常访问

xpath - 高级 XPath 查询

ruby-on-rails - yields 如何知道在哪里获取正确的 html 片段?

ruby-on-rails - 如何使用 RestClient 在 post 请求中发送数据

ruby - 限制要执行的线程数

python - 努力使用 Selenium 刮 table

java - 当多个按钮具有相同的 XPATH 时,无法单击单个按钮

ruby - Mechanize 获取文件而不是页面对象

ruby - 如何添加商标符号

ruby - 使用 ruby​​-vips 的第一步