如何让我的 Nokogiri :contains 不区分大小写?
How do I make my Nokogiri :contains case insensitive?
我正在使用 Ruby 2.4 和 Nokogiri。我有这个用于在我的页面上查找带有特定文本的元素...
a_elt = doc.at('a:contains("MY TEXT")')
如何使 :contains 不区分大小写?我不保证文字总是大写。
据我所知,使用 CSS 选择器规则这应该是不可能的。但是 XPath 2.0 可以通过使用 upper-case()
转换文本内容或使用带有第三个参数 'i'
而不是 contains()
的 matches()
来检查不区分大小写的文本,这将与不区分大小写的正则表达式。 Nokogiri 在内部将 CSS 选择器转换为 XPath 查询,因此您的示例变为 //a[contains(., "MY TEXT")
。然而,Nokogiri 的 XML 特征是基于 libxml2
(MRI Ruby) 或 javax.xml.xpath
(JRuby) 的,它们不支持 Xpath 2.0.
如果支持,您只需将 CSS 选择器替换为此 XPath 查询:
//a[contains(upper-case(.), "MY TEXT")]
但是您可以直接在 ruby 中实现文本比较,如下所示:
a_elt = doc.xpath('//a').detect { |node| /MY TEXT/i === node.text }
它不是很优雅,但它完成了工作:
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"
我正在使用 Ruby 2.4 和 Nokogiri。我有这个用于在我的页面上查找带有特定文本的元素...
a_elt = doc.at('a:contains("MY TEXT")')
如何使 :contains 不区分大小写?我不保证文字总是大写。
据我所知,使用 CSS 选择器规则这应该是不可能的。但是 XPath 2.0 可以通过使用 upper-case()
转换文本内容或使用带有第三个参数 'i'
而不是 contains()
的 matches()
来检查不区分大小写的文本,这将与不区分大小写的正则表达式。 Nokogiri 在内部将 CSS 选择器转换为 XPath 查询,因此您的示例变为 //a[contains(., "MY TEXT")
。然而,Nokogiri 的 XML 特征是基于 libxml2
(MRI Ruby) 或 javax.xml.xpath
(JRuby) 的,它们不支持 Xpath 2.0.
如果支持,您只需将 CSS 选择器替换为此 XPath 查询:
//a[contains(upper-case(.), "MY TEXT")]
但是您可以直接在 ruby 中实现文本比较,如下所示:
a_elt = doc.xpath('//a').detect { |node| /MY TEXT/i === node.text }
它不是很优雅,但它完成了工作:
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"