この HTML コードでは:
<div class="one">
.....
</div>
<div class="one">
.....
</div>
<div class="one">
.....
</div>
<div class="one">
.....
</div>
クラスが 1 の 2 番目または 3 番目の div を Nokogiri で選択するにはどうすればよいですか?
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 の両方の代替案について、次の点に注意してください。
NodeSet の代わりにat_css
andを使用して、最初に一致する要素を取得できます。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]')
page.css('div.one')[1] # For the second
page.css('div.one')[2] # For the third