2017-01-28 8 views
0

저는 Ruby 2.4와 Nokogiri를 사용하고 있습니다. 특정 텍스트로 내 페이지의 요소를 찾았습니다. ...Nokogiri : 대소 문자를 구분하지 않습니다.

어떻게하면 : 포함 할 수있는 케이스를 방불케합니까? 나는 텍스트가 항상 대문자임을 보장하지는 않는다.

답변

1

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 } 
+0

"NoMethodError : 정의되지 않은 메소드'텍스트 'for # " –

+0

Sry, 나는 실수로 # #를 사용했고, 대신 # xpath를 사용해야합니다. 나는 내 대답을 편집했다. –

+0

'doc.search ("a"). detect {...}'할 수있을 것 같네요. 일반적으로 비 루트 노드에서 Xpath의 놀라운 의미 때문에 Xpath보다 CSS를 선호하는 것이 좋습니다. – akuhn

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"