2009-02-07 6 views
1

Je veux extraire les liens des sites membres d'un site. On dirait que ceRuby Regex Aide

<a href="http://www.ptop.se" target="_blank"> 

i testé avec elle ce site

http://www.rubular.com/

<a href="(.*?)" target="_blank"> 

Shall sortie http://www.ptop.se,

vient ici le code

require 'open-uri' 
    url = "http://itproffs.se/forumv2/showprofile.aspx?memid=2683" 
    open(url) { |page| content = page.read() 
    links = content.scan(/<a href="(.*?)" target="_blank">/) 
    links.each {|link| puts #{link} 
    } 
    } 

si vous exécutez ceci, cela ne fonctionne pas. pourquoi pas?

Répondre

1

Plusieurs problèmes avec votre code

  1. Je ne sais pas ce que vous entendez en utilisant

    {lien}. Mais si vous voulez ajouter un caractère '#' au lien, assurez-vous que

    vous enveloppez cela avec des guillemets. ie "# {link}"
  2. String.scan accepte un bloc. Utilisez-le pour faire défiler les correspondances.
  3. La page que vous essayez d'accéder ne renvoie aucun lien que le regex ira quand même.

Voici quelque chose qui fonctionnerait:

require 'open-uri' 
url = "http://itproffs.se/forumv2/" 
open(url) do |page| 
    content = page.read() 
    content.scan(/<a href="(.*?)" target="_blank">/) do |match| 
      match.each { |link| puts link} 
     end 
end 

Il sont de meilleures façons de le faire, je suis sûr. Mais cela devrait fonctionner.

Hope it helps

+0

Votre premier point est pas vrai. Vous devriez probablement * utiliser * do/end pour plus de clarté, mais les blocs multi-lignes peuvent utiliser des accolades. –

+0

Je ne le savais pas. Tu as raison. Je m'excuse pour la désinformation. Corrigée. – dmondark

2

Je suggère que vous utilisez l'une des bibliothèques d'analyse syntaxique HTML/XML bon exemple ruby Hpricot ou Nokogiri.

Si vous devez vous connecter sur le site vous pourriez être intéressé par une bibliothèque comme WWW::Mechanize.

Exemple de code:

require "open-uri" 
require "hpricot" 
require "nokogiri" 

url = "http://itproffs.se/forumv2" 

# Using Hpricot 
doc = Hpricot(open(url)) 
doc.search("//a[@target='_blank']").each { |user| puts "found #{user.inner_html}" } 

# Using Nokogiri 
doc = Nokogiri::HTML(open(url)) 
doc.xpath("//a[@target='_blank']").each { |user| puts "found #{user.text}" }