如何制作我的Nokogiri:包含不区分大小写?

时间:2017-01-28 21:23:38

标签: ruby nokogiri case-insensitive contain

我使用Ruby 2.4和Nokogiri。我有这个用于在我的页面上找到一个带有特定文本的元素......

a_elt = doc.at('a:contains("MY TEXT")') 

如何使:包含不区分大小写?我不保证文本总是大写。

2 个答案:

答案 0 :(得分:1)

根据CSS选择器规则,据我所知,这是不可能的。但XPath 2.0可以通过使用upper-case()转换文本内容或使用matches()使用第三个参数'i'而不是contains()来检查文本不区分大小写,这将与不区分大小写的正则表达式。 Nokogiri在内部将CSS选择器转换为XPath查询,因此您的示例变为//a[contains(., "MY TEXT")。但是,Nokogiri的XML功能基于libxml2(MRI Ruby)或javax.xml.xpath(JRuby),它们不支持Xpath 2.0。

如果支持,则可以使用此XPath查询替换CSS选择器:

//a[contains(upper-case(.), "MY TEXT")]

但你可以直接在ruby中实现文本比较,如下所示:

a_elt = doc.xpath('//a').detect { |node| /MY TEXT/i === node.text }

答案 1 :(得分:0)

它不是很优雅,但它可以胜任:

require 'nokogiri'

doc = Nokogiri::XML(File.read("test.html"))

a_elt = doc.at("//a[
                    contains(
                      translate(
                        text(),
                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                        'abcdefghijklmnopqrstuvwxyz'),
                      'my text')
               ]")

p a_elt.text
#=> "My TeXt Is WeIrD"