2010-10-27 6 views
1

J'ai utilisé avec succès l'analyse CSS de ruby ​​(1.8) et de nokogiri pour extraire les données de face avant des pages Web.Comment analyser le code source html avec ruby ​​/ nokogiri?

Cependant, j'ai maintenant besoin de retirer des données d'une série de pages où les données se trouvent dans les balises "meta" dans le code source de la page.

L'une des lignes dont j'ai besoin est le suivant:

<meta name="geo.position" content="35.667459;139.706256" /> 

J'ai essayé d'utiliser mis XPath n'ont pas été en mesure de faire les choses.

Toute aide concernant la syntaxe requise serait grandement appréciée.

Merci

+4

Vous dites: « Je l'ai essayé d'utiliser mis XPath n'ont pas été en mesure d'obtenir ce droit. » ** Montrez-nous ce que vous avez essayé ** afin que nous puissions vous aider à le faire correctement. –

+0

Thx Andy - différentes façons de dire '// meta [blah]' etc. Je ne pouvais pas obtenir la syntaxe correcte pour la retirer. Je voulais vraiment le faire avec le sélecteur css et maintenant je sais comment. – rollbahn

Répondre

2

C'est un bon cas pour un CSS attribute selector. Par exemple:

doc.css('meta[name="geo.position"]').each do |meta_tag| 
    puts meta_tag['content'] # => 35.667459;139.706256 
end 

L'expression XPath équivalente est presque identique:

doc.xpath('//meta[@name = "geo.position"]').each do |meta_tag| 
    puts meta_tag['content'] # => 35.667459;139.706256 
end 
+0

Wow thanks Je n'avais aucune idée que vous pouviez utiliser le sélecteur CSS pour les balises META aussi. Si je voulais obtenir le lat/long de la js, est-ce la même chose? rollbahn

+0

Non, Nokogiri ne fait pas Javascript. Vous pouvez extraire le Javascript du HTML en utilisant Nokogiri, puis utiliser une regex pour obtenir le lat/long. 'doc.at ('script'). content [/ GLatLng \\ (([^)] +) \\) /, 1] # =>" 35.667459, 139.706256 "' par exemple. –

+0

Aha ok génial merci beaucoup pour votre aide - qui a vraiment rendu les choses beaucoup plus claires. – rollbahn

1
require 'nokogiri' 

doc = Nokogiri::HTML('<meta name="geo.position" content="35.667459;139.706256" />') 
doc.at('//meta[@name="geo.position"]')['content'] # => "35.667459;139.706256" 
Questions connexes