3

jQueryには、:eq一致した要素のセットを特定のインデックスを持つものに減らすためのセレクターがあります。

のこぎりでも同じことができるのでしょうか?長い間検索しましたが、方法が見つかりませんでした。

この例を参照してください。

require 'nokogiri'

html ='
<div>
<p>foo</p></div>
<span>
<p>bar</p>
<p>foobar</p></span>
'

doc = Nokogiri::HTML(html)

p doc.search('p:eq(0)')
# -> []
4

3 に答える 3

3

これが私が釣る方法です:

require 'nokogiri'

html ='
<p>foo</p>
<p>bar</p>
<p>foobar</p>
'

doc = Nokogiri::HTML(html)

doc.search('//p[3]')
=> [#<Nokogiri::XML::Element:0x811058ac name="p" children=[#<Nokogiri::XML::Text:0x81104f74 "foobar">]>]

Nokogiriは、配列のように機能するノードのコレクションであるNodeSetを返しました。ノードだけを取得するat代わりに、を使用して検索できます。search

doc.at('//p[3]').text
=> "foobar"

または、NodeSetを返すことができ、Rubyに特定の要素を抽出させることができます。

doc.search('//p')[2].text
=> "foobar"

p doc.search('p:eq(0)')

'p:eq(0)'CSSでもXPathでもありません。これは、JavaScriptに追加されたjQueryセレクターです。NokogiriをアクセサーとしてjQueryまたはJavaScriptを使用することはできません。CSSまたはXPathである必要があります。


あなたの例は私が望むことさえしません。[i]演算子は、n番目の子に相当します。

jQueryのドキュメントに:eqよると:

説明:一致した要素のセットを、指定されたインデックスの要素に減らします。

//p[3]、またはsearch('p')[2]RubyにNodeSetをスライスさせるために使用すると、特定のノードが返されます。私の例<p>では、jQueryと同等の3番目のタグのコンテンツを取得してい:eq(2)ます。

前と同じ例を使用して:

require 'nokogiri'

html ='
<p>foo</p>
<p>bar</p>
<p>foobar</p>
'

doc = Nokogiri::HTML(html)

doc.search('//p[0]').text
doc.search('//p[1]').text
doc.search('//p[2]').text
doc.search('//p[3]').text

doc.search('//p')[0].text
doc.search('//p')[1].text
doc.search('//p')[2].text
doc.search('//p')[3].text

それをIRBにダンプすると、次のようになります。

irb(main):011:0* doc.search('//p[0]').text # => ""
irb(main):012:0> doc.search('//p[1]').text # => "foo"
irb(main):013:0> doc.search('//p[2]').text # => "bar"
irb(main):014:0> doc.search('//p[3]').text # => "foobar"

irb(main):015:0> doc.search('//p')[0].text # => "foo"
irb(main):016:0> doc.search('//p')[1].text # => "bar"
irb(main):017:0> doc.search('//p')[2].text # => "foobar"
irb(main):018:0> doc.search('//p')[3].text 
NoMethodError: undefined method `text' for nil:NilClass
from (irb):18

使用//p[1]することは、JavaScriptとjQueryで以下のHTMLを使用し、それをブラウザにロードして、「foo」を示すアラートを確認することと同じです。

<html>
  <head>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
  </head>
  <body>
    <p>foo</p>
    <p>bar</p>
    <p>foobar</p>
    <script>
$().ready(function(){
    alert($('p:eq(0)').text());
});
    </script>
  </body>
</html>

したがって、 XPathまたはRuby//p[1]スライスを使用すると、JavaScript[0]の場合と同等になります。:eq(0)ただし、NokogiriはJavaScriptまたはjQueryを実行しないため、CSSまたはXPathのいずれかを使用する必要があります。


jQueryのセレクターが利用可能になり、次のようなことが可能になります。

require 'nokogiri'

html = '
<html>
  <body>
    <p>foo</p>
    this text
    <p>bar</p>
  </body>
</html>
'

doc = Nokogiri::HTML(html)
doc.at('p:contains("foo")').next_sibling.text.strip
=> "this text"
于 2012-11-08T15:19:43.127 に答える
0

一致するノードのセットを減らす唯一の方法は、Rubyと次のような配列メソッドを使用することです。

doc = Nokogiri ... 
doc.search("table")[2].search("...")

NokogiriのXPathもCSSセレクターも、jQueryの:eq演算子と同等の機能をサポートしていません。

于 2012-11-11T09:06:21.260 に答える
-1

試してみてください :nth-child(N)(最初の要素はN = 1で検索されます)

于 2012-11-08T13:38:21.487 に答える