2012-04-22 12 views
6

Con questo codice HTML:parsing del codice HTML con Nokogiri in Ruby

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

Come posso selezionare con Nokogiri la seconda o terza div cui classe è uno?

risposta

5
page.css('div.one')[1] # For the second 
page.css('div.one')[2] # For the third 
+2

Originariamente questa risposta ha avuto il CSS 'div # One' . Questo trova un div con un * id * di 'one', ma l'HTML ha * classes * di' one'. Ecco perché ho creato il CSS 'div.one'. '# seleziona un ID,' .' seleziona una classe. –

7

È possibile utilizzare Ruby per snellire un grande risultati esposti a elementi specifici:

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 

Perché Rubino indicizzazione parte da zero si deve prendere cura con cui gli elementi che si desidera.

In alternativa, è possibile utilizzare selettori CSS per trovare la nth item:

# 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)') 

Oppure si può usare XPath per ottenere incontri tornare specifici:

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

Con entrambe le alternative CSS e XPath notare che :

  1. Numerazione inizia da 1, non 0
  2. È possibile utilizzare at_css e at_xpath per ripristinare il primo elemento di corrispondenza, anziché un NodeSet.

    # 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)') 
    

Infine, si noti che se si seleziona un singolo elemento da indice con XPath, è possibile utilizzare un formato più breve:

# 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]') 
+0

Grazie mille per l'abbondante quantità di esempi. Abbiamo bisogno di più risposte come questa! +1 –