6

この HTML コードでは:

<div class="one">
  .....
</div>
<div class="one">
  .....
</div>
<div class="one">
  .....
</div>
<div class="one">
  .....
</div>

クラスが 1 の 2 番目または 3 番目の div を Nokogiri で選択するにはどうすればよいですか?

4

2 に答える 2

7

Ruby を使用して、大きな結果セットを特定の項目に絞り込むことができます。

page.css('div.one')[1,2]  # Two items starting at index 1 (2nd item)
page.css('div.one')[1..2] # Items with indices between 1 and 2, inclusive

Ruby のインデックス作成はゼロから始まるため、必要な項目に注意する必要があります。

または、CSS セレクターを使用してn番目の項目を見つけることができます。

# Second and third items from the set, jQuery-style
page.css('div.one:eq(2),div.one:eq(3)')

# Second and third children, CSS3-style
page.css('div.one:nth-child(2),div.one:nth-child(3)')

または、XPath を使用して特定の一致を取得することもできます。

# Second and third children
page.xpath("//div[@class='one'][position()=2 or position()=3]")

# Second and third items in the result set
page.xpath("(//div[@class='one'])[position()=2 or position()=3]")

CSS と XPath の両方の代替案について、次の点に注意してください。

  1. 番号は 0 ではなく 1 から始まります
  2. NodeSet の代わりにat_cssandを使用して、最初に一致する要素を取得できます。at_xpath

    # A NodeSet with a single element in it:
    page.css('div.one:eq(2)')
    
    # The second div element
    page.at_css('div.one:eq(2)')
    

最後に、XPath を使用してインデックスで単一の要素を選択する場合は、より短い形式を使用できることに注意してください。

# First div.one seen that is the second child of its parent
page.at_xpath('//div[@class="one"][2]')

# Second div.one in the entire document
page.at_xpath('(//div[@class="one"])[2]')
于 2012-04-23T16:51:14.420 に答える
5
page.css('div.one')[1] # For the second
page.css('div.one')[2] # For the third
于 2012-04-22T19:48:32.900 に答える