2010-01-22 14 views
5

Estoy aprendiendo cómo utilizar nokogiri y algunas preguntas vinieron a mí basado en el código de abajocómo utilizar métodos Nokogiri .xpath y .at_xpath

require 'rubygems' 
require 'mechanize' 

post_agent = WWW::Mechanize.new 
post_page = post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708') 

puts "\nabsolute path with tbody gives nil" 
puts post_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div[2]').xpath('text()').to_s.strip.inspect 

puts "\n.at_xpath gives an empty string" 
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").at_xpath('text()').to_s.strip.inspect 

puts "\ntwo lines solution with .at_xpath gives an empty string" 
rows = post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]") 
puts rows[0].at_xpath('text()').to_s.strip.inspect 


puts 
puts "two lines working code" 
rows = post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]") 
puts rows[0].xpath('text()').to_s.strip 

puts "\none line working code" 
puts post_page.parser.xpath("//div[@id='posts']/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip 

puts "\nanother one line code" 
puts post_page.parser.at_xpath("//div[@id='posts']/div/table/tr/td/div[2]").xpath('text()').to_s.strip 

puts "\none line code with full path" 
puts post_page.parser.xpath("/html/body/div/div/div/div/div/table/tr/td/div[2]")[0].xpath('text()').to_s.strip 
  • es mejor usar // o/en xpath? @AnthonyWJones dice que 'el uso de un // no prefijado' no es tan buena idea
  • Tuve que eliminar tbody de cualquier xpath en funcionamiento, de lo contrario obtuve un resultado 'nil'. ¿Cómo es posible eliminar un elemento de xpath para que las cosas funcionen?
  • ¿Tengo que usar .xpath dos veces para extraer datos si no estoy utilizando xpath completo?
  • ¿Por qué no puedo hacer que .at_xpath trabaje para extraer datos? funciona bien here ¿cuál es la diferencia?

Respuesta

8
  1. // significa que cada nodo en todos los niveles por lo que es mucho más caro en comparación con /
  2. puede utilizar * como marcador de posición.
  3. No, usted puede hacer una consulta XPath, obtener el elemento continuación, llamar al método nokogiri text en el nodo
  4. Claro que puedes. Eche un vistazo al this question y mi archivo de referencia. Verá un ejemplo de at_xpath.

Lo encontré a menudo uso text() expresión. Esto no es requerido usando Nokogiri. Puede recuperar el nodo y luego llamar al método text en el nodo. Es mucho menos costoso

También tenga en cuenta que Nokogiri admite los selectores .css. Pueden ser más fáciles si está trabajando con páginas HTML.

+0

@Simone Carletti: gracias por eso. Tal vez todas mis preguntas surjan porque no sé cómo leer la documentación en http://nokogiri.org. No sé cómo encontrar algo acerca de llamar al método de texto en el nodo. ¿Sería posible escribir más sobre eso? Ya encuentro que mi secuencia de comandos es lenta, sería genial hacerlo más rápido. – Radek

+0

Encontré que un marcador de posición XPath es una expresión xpath real. Entonces, ¿qué significa usar * como marcador de posición? – Radek

+0

* significa cualquier nodo. Por ejemplo, en '/ node/foo/one' y'/node/bar/one', '/ node/*/one' coincide con ambas rutas. –

Cuestiones relacionadas