2010-01-22 3 views
5

J'apprends comment utiliser nokogiri et quelques questions me sont venues me basant sur le code ci-dessouscomment utiliser des méthodes 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 
  • est-il préférable d'utiliser // ou/dans xpath? @AnthonyWJones dit que «l'utilisation d'un // non préfixé» n'est pas si bonne idée
  • Je devais retirer tbody de n'importe quel xpath de travail sinon j'ai obtenu le résultat «nul». Comment est-il possible de supprimer un élément du xpath pour que les choses fonctionnent?
  • Dois-je utiliser .xpath deux fois pour extraire des données si je n'utilise pas xpath?
  • pourquoi je ne peux pas faire fonctionner .at_xpath pour extraire des données? cela fonctionne bien here quelle est la différence?

Répondre

8
  1. // signifie que chaque nœud à tous les niveaux il est donc beaucoup plus cher par rapport à /
  2. vous pouvez utiliser * comme espace réservé.
  3. Non, vous pouvez faire une requête XPath, obtenir l'élément, puis appeler la méthode nokogiri text sur le nœud
  4. Bien sûr, vous pouvez. Jetez un oeil à this question et mon fichier de référence. Vous verrez un exemple de at_xpath.

J'ai trouvé que vous utilisiez souvent l'expression text(). Ceci n'est pas requis avec Nokogiri. Vous pouvez récupérer le nœud puis appeler la méthode text sur le nœud. C'est beaucoup moins cher.

Gardez également à l'esprit que Nokogiri prend en charge les sélecteurs .css. Ils peuvent être plus faciles si vous travaillez avec des pages HTML.

+0

@Simone Carletti: merci pour cela. Peut-être que toutes mes questions viennent parce que je ne sais pas comment lire la documentation sur http://nokogiri.org Je ne sais pas comment trouver quoi que ce soit à propos de l'appel de la méthode de texte sur le nœud. Serait-il possible d'écrire plus à ce sujet. Je trouve déjà mon script un peu lent, ce serait génial de le rendre plus rapide. – Radek

+0

J'ai trouvé qu'un espace réservé XPath est une véritable expression xpath. Alors qu'est-ce que cela signifie d'utiliser * comme espace réservé? – Radek

+0

* signifie n'importe quel noeud. Par exemple, dans '/ node/foo/one' et'/node/bar/one', '/ node/*/one' correspond aux deux chemins. –

Questions connexes