Ces liens ont réellement class=l
et non class="l"
. En passant, pour comprendre cela, j'ai ajouté un enregistrement à la méthode afin que vous puissiez voir la sortie à différentes étapes et le déboguer. J'ai cherché la chaîne que vous attendiez et je ne l'ai pas trouvée, c'est pourquoi votre regex a échoué. J'ai donc cherché la bonne corde que vous vouliez et j'ai changé l'expression rationnelle en conséquence. Les compétences de débogage sont pratiques.
require "open-uri"
url = "http://www.google.com/search?q=ruby"
source = open(url).read
puts "--- PAGE SOURCE ---"
puts source
links = source.scan(/<a.+?href="(.+?)".+?class=l/)
puts "--- FOUND THIS MANY LINKS ---"
puts links.size
puts "--- PRINTING LINKS ---"
links.each do |link|
puts "- #{link}"
end
J'ai également amélioré votre regex. Vous recherchez un texte qui commence par l'ouverture d'un tag (<a
), puis certains caractères dont vous n'avez pas besoin (.+?
), un attribut href (href="
), le contenu de l'attribut href que vous voulez pour capturer ((.+?)
), certains espaces ou d'autres attributs (.+?
), et enfin la classe attrubute (class=l
). J'ai .+?
à trois endroits là. le .
signifie n'importe quel caractère, le +
signifie qu'il doit y avoir une ou plusieurs des choses juste avant, et le ?
signifie que le .+
devrait essayer de faire correspondre une chaîne aussi courte que possible.
Eh bien, oui. Cela aussi. Les analyseurs HTML sont beaucoup mieux à ce sujet. –