2010-01-22 11 views
5

sto imparando come utilizzare nokogiri e qualche domanda mi venne in base al codice di seguitocome utilizzare i metodi Nokogiri .xpath & .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 
  • è meglio utilizzare // o/in xpath? @AnthonyWJones dice che "l'uso di un non-prefisso //" non è una buona idea
  • Ho dovuto rimuovere tbody da qualsiasi xpath funzionante altrimenti ho ottenuto il risultato 'nil'. Come è possibile rimuovere un elemento da xpath per far funzionare le cose?
  • devo utilizzare .xpath due volte per estrarre i dati se non si utilizza xpath completo?
  • perché non riesco a eseguire .at_xpath per estrarre i dati? funziona bene here qual è la differenza?

risposta

8
  1. // significa che ogni nodo ad ogni livello in modo che sia molto più costoso rispetto a /
  2. è possibile utilizzare * come segnaposto.
  3. No, è possibile effettuare una query XPath, ottenere l'elemento quindi chiamare il metodo nokogiri text sul nodo
  4. Certo che si può. Dai un'occhiata a this question e al mio file benchmark. Vedrai un esempio di at_xpath.

Ho trovato che usi spesso l'espressione text(). Questo non è richiesto usando Nokogiri. È possibile recuperare il nodo, quindi chiamare il metodo text sul nodo. È molto meno costoso.

Inoltre, Nokogiri supporta i selettori di .css. Possono essere più facili se lavori con pagine HTML.

+0

@Simone Carletti: grazie per quello. Forse tutte le mie domande arrivano perché non so leggere la documentazione su http://nokogiri.org. Non so come trovare nulla sul chiamare il metodo di testo sul nodo. Sarebbe possibile scrivere di più a riguardo. Ho già trovato il mio script un po 'lento, sarebbe bello renderlo più veloce. – Radek

+0

Ho trovato che un segnaposto XPath è una vera espressione xpath. Quindi cosa significa usare * come segnaposto? – Radek

+0

* indica qualsiasi nodo. Ad esempio, in '/ node/foo/one' e'/node/bar/one', '/ node/*/one' corrisponde a entrambi i percorsi. –

Problemi correlati