2017-01-28 29 views
0

私はRuby 2.4とNokogiriを使用しています。ケースinsenstiiveが含まれています。私はNokogiri:大文字と小文字は区別されません。

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

はどのように作ることができます...特定のテキストで自分のページ上の要素を見つけるためにこれを持っていますか?私はテキストが常に大文字になることは保証されていません。

答えて

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")] 

をしかし、あなたはちょうどこのようなRubyで直接テキスト比較を実装できます。

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

この結果、 "NoMethodError:未定義メソッド'テキスト'for# " –

+0

Sry、私は誤って'#at'を使用しましたが、代わりに '#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" 
関連する問題