2012-04-22 11 views
6

Con este código HTML:análisis de HTML con Nokogiri en Ruby

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

¿Cómo puedo seleccionar con Nokogiri la segunda o tercera div cuya clase es uno?

Respuesta

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

Originalmente esta respuesta tuvo la CSS 'div # one' . Eso encuentra un div con un * id * de 'uno', pero el HTML tiene * clases * de' uno'. Es por eso que hice el CSS 'div.one'. '#' selecciona una ID, '.' selecciona una clase. –

7

Puede utilizar Ruby a recortar un gran conjunto de resultados a artículos específicos:

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 

Debido Rubí indexación comienza en cero se debe tener cuidado con los elementos que desea.

Como alternativa, puede utilizar los selectores CSS para encontrar el 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)') 

O puede utilizar XPath para obtener partidos de vuelta específicos:

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

Tanto con las alternativas CSS y XPath en cuenta que :

  1. Numeración comienza en 1, no 0
  2. En su lugar, puede usar at_css y at_xpath para recuperar el primer elemento coincidente, en lugar de 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)') 
    

Por último, tenga en cuenta que si va a seleccionar un solo elemento por el índice con XPath, se puede utilizar un formato más corto:

# 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

Muchas gracias por la cantidad de ejemplos abundantes. ¡Necesitamos más respuestas como esta! +1 –