2010-01-04 8 views
3

Ma première question ici, serait génial pour trouver une réponse. Je suis nouveau à l'utilisation de nokogiri.extraire le contenu de l'attribut de contenu dans la méta-balise d'un site Web donné une valeur spécifiée pour l'attribut de nom avec nokogiri dans ruby?

Voici mon problème. J'ai quelque chose comme ça dans la tête HTML sur un site cible (ici un post techcrunch):

<meta content="During my time at TechCrunch I've seen thousands of startups and written about hundreds of them. I sure as hell don't know all ..." name="description"/> 

Je voudrais maintenant avoir un script à exécuter dans les balises meta, recherchez l'un avec l'attribut name " description "et obtenir ce qui est dans l'attribut de contenu.

J'ai essayé quelque chose comme ça

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = "http://www.techcrunch.com/2009/10/11/the-underutilized-power-of-the-video-demo-to-explain-what-the-hell-you-actually-do/" 
doc = Nokogiri::HTML(open(url)) 
posts = doc.xpath("//meta") 
posts.each do |link| 
    a = link.attributes['name'] 
    b = link.attributes['content'] 
end 

après que je pouvais choisir le lien où le nom d'attribut est égal à la description - mais ce code renvoie nil pour a et b. J'ai joué avec posts = doc.xpath("//meta"), posts = doc.xpath("//meta/*"), etc. mais toujours rien.

+0

Le problème n'est pas avec le xpath, car il semble que le document ne soit pas analysé. Vous pouvez vérifier qu'avec 'puts doc', il ne contient pas l'entrée complète. – akuhn

Répondre

1

Le problème n'est pas lié au chemin xpath, car il semble que le document ne soit pas analysé. Vous pouvez vérifier cela avec puts doc, il ne contient pas l'entrée complète. Cela semble être un problème avec l'analyse des commentaires (je soupçonne un code HTML invalide ou un bogue dans libxml2).

Dans votre cas, j'utiliserais une expression régulière comme solution de contournement. Étant donné que <meta> balises sont assez simples qui pourraient travailler, par exemple /<meta name="([^"]*)" content="([^"]*)"/

0

vous devez changer

doc = Nokogiri::HTML(open(url)) 

à

doc = Nokogiri::HTML(open(url).read) 

mise à jour: ou peut-être pas :) En fait votre code fonctionne pour moi, en utilisant ruby 1.8.7/nokogiri 1.4.0