저는 Ruby 2.4와 Nokogiri를 사용하고 있습니다. 특정 텍스트로 내 페이지의 요소를 찾았습니다. ...Nokogiri : 대소 문자를 구분하지 않습니다.
어떻게하면 : 포함 할 수있는 케이스를 방불케합니까? 나는 텍스트가 항상 대문자임을 보장하지는 않는다.
저는 Ruby 2.4와 Nokogiri를 사용하고 있습니다. 특정 텍스트로 내 페이지의 요소를 찾았습니다. ...Nokogiri : 대소 문자를 구분하지 않습니다.
어떻게하면 : 포함 할 수있는 케이스를 방불케합니까? 나는 텍스트가 항상 대문자임을 보장하지는 않는다.
CSS 선택기 규칙을 사용하면 이것이 내가 아는 한 가능하지 않아야합니다. 그러나 XPath 2.0은 텍스트 내용을 upper-case()
으로 변환하거나 matches()
을 사용하여 대신 'i'
세 번째 매개 변수 (대/소문자를 구분하지 않는 정규식과 일치 함)를 사용하여 대/소문자를 구분하지 않습니다. Nokogiri는 내부적으로 CSS 선택기를 XPath 쿼리로 변환하므로 예제는 //a[contains(., "MY TEXT")
이됩니다. 그러나 Nokogiri의 XML 기능은 Xpath 2.0을 지원하지 않는 libxml2
(MRI Ruby) 또는 javax.xml.xpath
(JRuby)을 기반으로합니다.
이 방금이 XPath 쿼리와 CSS 선택기를 대체 할 수있는 지원 한 경우 :
//a[contains(upper-case(.), "MY TEXT")]
하지만 그냥 같이 루비에 직접 텍스트 비교를 구현할 수 있습니다
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"
"NoMethodError : 정의되지 않은 메소드'텍스트 'for # " –
Sry, 나는 실수로 # #를 사용했고, 대신 # xpath를 사용해야합니다. 나는 내 대답을 편집했다. –
'doc.search ("a"). detect {...}'할 수있을 것 같네요. 일반적으로 비 루트 노드에서 Xpath의 놀라운 의미 때문에 Xpath보다 CSS를 선호하는 것이 좋습니다. – akuhn