IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Extraction d'urls en PERL


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Extraction d'urls en PERL
    Hello à tous,

    Je suis noveau sur le forum et encore plus dans le monde PERL. J'ai une petite tache qui ma été assigné et il faut bien avouer, je sèche un peu.
    Je voudrais depuis un fichier html extraire les "href" pour ne garder que
    host.domain.xx - J'ai trouvé sur un site un script bien et je l'ai qq peu modifié:
    -----------------------
    # exturls.pl
    -----------------------

    while (<>) {
    $src .= $_
    } ;
    $_ = $src ;
    while (m|href="http://(.*?)"|gs) {
    my $url=$1;
    print "$url\n";
    } ;

    -----------------------

    Par exemple, si je prends la page index.html du site http://www.icq.com et que je lance la commande suivante, j'obtiens:
    # perl exturls.pl index.html
    [...]
    games.icq.com/game.htm?code=110356410&RefId=MagicBall2_441x206
    entertainment.icq.com
    romance.icq.com
    people.icq.com/
    company.icq.com/info/advertise.html
    company.icq.com/info/contact.html
    company.icq.com/
    company.icq.com/info/icqstory.html
    www.icq.com/products/sitemap.html
    www.icq.com/legal/privacy.html
    www.icq.com/legal/

    Je voudrais arriver à ne garder que www.icq.com ou people.icq.com et tronquer le reste de la chaine pour ensuite, ne les afficher qu'une seule fois chacune.

    Auriez-vous une idée pour m'aider?

    Merci par avance

    M

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my %h ;
    while (m|href="http://(.*?)/?"|gs) {
     my $url=$1;
     $h{$url} = 1 ;
     } 
     print join("\n", keys %h};
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    Une solution a base de regxp , par contre c'est lent a cause du module URI::URL un vraie escargot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #!/usr/bin/perl -w
    use strict;
    use diagnostics;
    use URI::URL;
    use Regexp::Common qw/URI/;
    use Data::Dumper;
    use LWP::Simple;
     
     
    my %urls = ();
     
    # pompe une page
    my $page = get('http://www.free.fr');
     
     
     
    my $links = _extract_urls($page, 'http://www.free.fr');
     print Dumper($links);
     
     
    sub _extract_urls
    {
      my $base = shift;
      # tableau d'urls un hash est
      # préférable pour éviter les doublons
      my %urls = ();
      # extraction des urls
      while ( $page =~ /($RE{URI}{HTTP})/gi )
      {
         # Traitement des cliens relatif
         my $uri = url($1, $base)->abs;
     
         if ( _valid_scheme($uri) )
         {
           # Ajout de l'url dans le hash
           $urls{$uri} = undef unless exists $urls{$uri};
         }
      }
     return \%urls;
    }
     
     
     
     
    sub _valid_scheme
    {
      my $urlchk = shift;
      my $scheme = '';
      my @schema = qw (http);
      if ($urlchk =~ s/^([^:]*)://) {
        $scheme = lc($1);
      }
      if ($scheme && ! grep {$scheme eq $_} @schema) {
        print("Invalid scheme [$scheme]\n");
        return 0;
      }
     return 1;
    }
    Everybody have in their the potential to be their own god : Marilyn Manson

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par mobscene
    Une solution a base de regxp , par contre c'est lent a cause du module URI::URL un vraie escargot
    m'enfin, c'est déjà une regexp et il suffit d'ajouter un / juste après l'étoile paresseuse !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Je pense que pour ce genre de chose, si on ne veut pas trop s'embêter, c'est de télécharger un parsuer HTML sur le CPAN. Après, niveau apprentissage, je trouve sympa d'essayer de le réaliser soit même à base de regex
    La solution de Antoun donc fonctionner normalement
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

Discussions similaires

  1. recuperer le contenu d'un url avec perl
    Par fedodido dans le forum Langage
    Réponses: 1
    Dernier message: 16/03/2009, 09h54
  2. recuperer une URL en perl
    Par benoitZ31 dans le forum Web
    Réponses: 3
    Dernier message: 07/02/2008, 10h32
  3. [MySQL] extraction partie url
    Par herveD dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/06/2007, 17h45
  4. [RegEx] Extraction d'URL avec preg_match_all()
    Par pdtor dans le forum Langage
    Réponses: 2
    Dernier message: 20/01/2007, 11h22
  5. encodeur url en PERL
    Par stefcreator dans le forum Modules
    Réponses: 2
    Dernier message: 17/04/2003, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo