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

C Discussion :

Récupérer tous les liens d'une page html


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 24
    Points
    24
    Par défaut Récupérer tous les liens d'une page html
    Bonjour, j'aimerais Récupérer tous les liens d'une page html .
    Voila on récupere le code source avec file_get_contents je pense ou un truc du genre.

    Le probleme : utiliser la bonne fonction des regex pour isoler un lien entre <a href="...">

    j'aimerais l'équivalent de preg_match_all en php ca serait bien

  2. #2
    Membre actif Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Points : 252
    Points
    252
    Par défaut
    Moi je voudrais un get_food_by_mail(char *adresse) parceque j'ai faim,

    et un getAllAppCode() parce que je suis feignant...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 24
    Points
    24
    Par défaut
    Ok ok c'est bien ca mais le vrai probleme c'est le découpage de tous les liens !

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Pour l'équivalent de preg_match_all, peut être aller voir regex(3) (si vous êtes sous Unixoïde). Et pour file_get_contents : curl ?


    Julp.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 24
    Points
    24
    Par défaut
    Oui mais quelle fonction dans regex(3) car la j'en ai plein et je vois pas

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 24
    Points
    24
    Par défaut
    Up !

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    pourquoi ne pas faire un analyseur lexical.
    Cela te permettrait d'isoler les mots clefs que tu souhaites.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 24
    Points
    24
    Par défaut
    Heu ca a l'air super compliqué ce qui est marqué sur les sites analyseur lexical.

    Tu peux expliquer rapuidement ou carrément mettre le code et m'epliquer pk on fait un tel code ?

  9. #9
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Si la page cible est de l'xhtml bien formé et valide, on peut utiliser un parser XML pour l'ouvrir et chercher tous les liens avec une boucle ou de la recursivité, ou sinon récupérer tous les liens avec Xpath.

    http://xmlsoft.org/
    http://xmlsoft.org/examples/index.html#tree1.c
    http://www.w3schools.com/xpath/
    http://xmlsoft.org/examples/index.html#XPath

    Sinon, on peut le faire l'analyse à la main avec des strstr et strchr

    http://man.developpez.com/man3/strstr.3.php
    http://man.developpez.com/man3/strchr.3.php

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Gruik
    Si la page cible est de l'xhtml bien formé et valide, on peut utiliser un parser XML pour l'ouvrir et chercher tous les liens avec une boucle ou de la recursivité, ou sinon récupérer tous les liens avec Xpath.
    Et si il n'est pas bien formé et valide, on peut utiliser tidy pour corriger ce qui doit l'être.

    Citation Envoyé par Gruik
    Sinon, on peut le faire l'analyse à la main avec des strstr et strchr
    Ou un automate qui sépare les balises du texte et des commentaires. Ensuite il suffit d'aller chercher les (bons) attributs des balises (ou ce qui ressemble à des adresses dans le texte et les commentaires selon les besoins) pour obtenir les liens...
    C'est un peu comme un analyseur lexical, c'est vrai, mais cela peut être fait très simplement (et "à la main", c.à.d. sans utiliser d'outil pour générer du code à partir d'une grammaire) pour le HTML...

    Les regex, par contre, risquent de plus compliquer la chose que de la simplifier...enfin, c'est mon point de vue.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  11. #11
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Dès qu' un paquet est reçu du serveur il faut le lire caractère par caractère.
    Si ce n'est pas un '<' on laisse passer.
    Mais si c'en est un, et qu'en plus les suivants sont 'a href' ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (t[n] == '<' && t[n+1]=='a' && ... )
    ... Alors on s'y intéresse en donnant la valeur true à un flag qui indiquera qu'il faut reconcaténer l' URL au fur et à mesure jusqu'à ce qu'une apostrophe ou guillemet soit rencontré. Là tada l' URL est gardée au dans son tableau, et le flag remis à 0.
    Jusqu'à la fin du paquet.

    Ca prend trois lignes en python ou avec une lib ou un outil existant mais c'est tellement plus intéressant de le faire en C...

  12. #12
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Et pourquoi pas plus simplement

    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
     
    char *search = NULL;
    search = strstr(buffer, "<a href=\"");
    if(search != NULL)
    {
        char lien[256];
        if(sscanf(buffer, "< href=\"%s\") != 1)
        {
            /* erreur */
        }
        else
        {
            /* recherche du " a la fin et si present on l'enlever (on met \0 a la place /
        }
    }
    search++; /* on decale de un caractere pour pas tomber sur la meme occurence */
    for(;search = strstr(search, "<a href=\""); search++)
    {
        /* meme chose */
    }
    Pas tester, pas compilé.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  13. #13
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Ouep

    Faut voir aussi comment l'html est ecrit.. ca pourrait etre
    <A HREF
    <a Href

    Pis le href n'est pas forcement le premier attribut de la balise a
    <a target="_blank" href=..

    Ensuite, l'attribut href n'est pas forcement entre guillements, il peut etre entre quotes ou sans quotes
    <a href="url"
    <a href='url'
    <a href=url

    Mais si on connait la page cible, on peut se passer de tester tous les cas

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Gruik
    Faut voir aussi comment l'html est ecrit.. ca pourrait etre
    <A HREF
    <a Href

    Pis le href n'est pas forcement le premier attribut de la balise a
    <a target="_blank" href=..

    Ensuite, l'attribut href n'est pas forcement entre guillements, il peut etre entre quotes ou sans quotes
    <a href="url"
    <a href='url'
    <a href=url

    Mais si on connait la page cible, on peut se passer de tester tous les cas
    Normalement les noms des balises ainsi que leurs attributs sont en minuscule. Les valeurs doivent être entourées par des doubles guillements (c'est la norme après les navigateurs les plus populaires ont toujours été très souple là dessus donc c'est pas gagné).
    Après c'est vrai que href n'est pas forcement le premier attribut, donc pour faire bien, il faut recréer un analyseur syntaxique, pour faire vite les expressions régulières devraient faire l'affaire : Les expressions régulières en C

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 86
    Points : 97
    Points
    97
    Par défaut
    salut,

    parser du HTML pour en extraire certains elements peut etre plus complexe qu'il n'y parait: les commentaires et les sauts de lignes peuvent apparaitre a peu pres n'importe-ou (y compris au milieu d'un element), il faut gerer le cas des guillemets presents ou non, des balises fermantes pas toujours presentes, il peut y avoir du javascript en plein milieu, dont le code, bien qu'encadre par des balises <script> peut contenir un signe '<' dans une expression arithmetique, etc..

    on peut effectivement s'en sortir avec des regexp, mais au prix de pas mal de compromis. la solution ideale semble effectivement etre le parser base sur un automate a etats, ce qui donne d'excellents resultats.

    il s'agit de savoir si le HTML a parser est potentiellement "hostile" ou non. si c'est toi qui le generes, ou si tu as des raisons de croire qu'il sera propre, alors les regexp peuvent suffire (apres eventuellement un pre-traitement par un outil comme "tidy", comme le faisait remarquer Gruik^WDavid.Schris ), sinon tu es bon pour la feuille A4 et le tableau etats-transitions.

    une solution alternative, si tu peux te permettre de proceder etape par etape, est d'utiliser un browser en mode texte comme lynx de la facon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lynx -dump <a href="http://www.developpez.net" target="_blank">http://www.developpez.net</a>
    la liste des liens contenus dans le document apparait alors a la fin du dump (et la, ca se parse tout seul).

    -pirus.

  16. #16
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Skyrunner
    Et pourquoi pas plus simplement

    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
     
    char *search = NULL;
    search = strstr(buffer, "<a href=\"");
    if(search != NULL)
    {
        char lien[256];
        if(sscanf(buffer, "< href=\"%s\") != 1)
        {
            /* erreur */
        }
        else
        {
            /* recherche du " a la fin et si present on l'enlever (on met \0 a la place /
        }
    }
    search++; /* on decale de un caractere pour pas tomber sur la meme occurence */
    for(;search = strstr(search, "<a href=\""); search++)
    {
        /* meme chose */
    }
    Pas tester, pas compilé.
    Parce-que, dans ta recherche tu supposes que :
    • l'attribut "href" est forcément le premier dans toutes les balises "<a ..." ;
    • le "a" n'est séparé de "href" que d'un seul caractère espace ;
    • ce qui sépare le "a" de "href" est forcément un espace ;
    • la valeur de l'attribut "href" est toujours entourée de guillemets ;
    • etc.

    Et puis il n'y a pas que la balise "<a ..." ni que l'attribut "href".

    C'est pourquoi je préconisais un automate : bien conçu et sans avoir besoin d'être complexe, il permet de facilement séparer les balises du reste, puis de dissocier les éléments d'une balise (le nom, les attributs et pour chacun d'eux leur nom et leur valeur).

    Et quand je dis qu'il n'a pas besoin d'être complexe, je le prouve en vous donnant l'exemple d'un programme écrit par un pote (que je transformerai probablement en librairie...un jour) :
    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
    [d_schris@fool.internal.doubleclick.net src]$ wget -O - -q 'http://www.developpez.net/forums/showpost.php?p=1215345&postcount=12' | ./htmlSplit | head -n 219 | tail -n 30
    texte:     
    balise:        <div id="post_message_1215345">
    texte: Et pourquoi pas plus simplement
    balise:         <br />
    texte:   
    balise:         <br />
    texte:   
    commentaire: <!-- BEGIN TEMPLATE: bbcode_code -->
    texte:  
    balise:         <div style="margin:20px; margin-top:5px">
    texte:    
    balise:          <div class="smallfont" style="margin-bottom:2px">
    texte: Code  :
    balise:          </div>
    texte:    
    balise:          <pre class="alt2" style="margin:0px; padding:6px; border:1px inset; width:95%; height:(258+3)px; overflow:auto">
    balise:           <div dir="ltr" style="text-align:left;">
    texte: char *search = NULL;  search = strstr(buffer, &quot;&lt;a href=\&quot;&quot;);  if(search != NULL)  {      char lien[256];      if(sscanf(buffer, &quot;&lt; href=\&quot;%s\&quot;) != 1)      {          /* erreur */      }      else      {          /* recherche du &quot; a la fin et si present on l'enlever (on met \0 a la place /      }  }  search++; /* on decale de un caractere pour pas tomber sur la meme occurence */  for(;search = strstr(search, &quot;&lt;a href=\&quot;&quot;); search++)  {      /* meme chose */  }  
    balise:           </div>
    balise:          </pre>
    texte:   
    balise:         </div>
    texte:  
    commentaire: <!-- END TEMPLATE: bbcode_code -->
    texte:   
    balise:         <br />
    texte:   Pas tester, pas compilé.
    balise:        </div>
    texte:     
    commentaire: <!-- / message -->
    [d_schris@fool.internal.doubleclick.net src]$ wc -l main.c
        376 main.c
    [d_schris@fool.internal.doubleclick.net src]$
    Les plus attentifs noteront qu'il gère aussi l'indentation des balises.
    A noter que la commande "wc" compte le nombre de lignes du fichier source, pas le nombre de lignes de code (i.e. : les commentaires et les lignes vides sont aussi comptés).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Gruik
    Ouep

    [...]

    Pis le href n'est pas forcement le premier attribut de la balise a
    <a target="_blank" href=..

    Ensuite, l'attribut href n'est pas forcement entre guillements, il peut etre entre quotes ou sans quotes
    <a href="url"
    <a href='url'
    <a href=url

    [...]
    Argh ! Cet homme m'a doublé !

    Citation Envoyé par gege2061
    pour faire vite les expressions régulières devraient faire l'affaire
    Bon courage

    Citation Envoyé par pirus
    la solution ideale semble effectivement etre le parser base sur un automate a etats, ce qui donne d'excellents resultats.
    Merci de ton soutien

    Citation Envoyé par pirus
    (apres eventuellement un pre-traitement par un outil comme "tidy", comme le faisait remarquer Gruik)
    Redde Caesari quae sunt Caesaris : http://www.developpez.net/forums/sho...0&postcount=10
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  18. #18
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Je sais j'ai suposé beaucoup de choses. Mais bon c'était juste un exemple pour une page type.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 24
    Points
    24
    Par défaut
    Bonjour, jai absolument RIEN pigé a l'automate
    je pensais qu'on pourrait faire un truc genre preg_match_all de php, simplement
    Y'a pas une autre méthode que l'automate ?

  20. #20
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    je ne sais pas si tu est au courant, mais ton post as declenché un 'defi' dont le but et de faire parser html: http://www.developpez.net/forums/sho...d.php?t=189597

    quelques codes sont deja postés, tu peux t'en inspirer.
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

Discussions similaires

  1. Erreur, Parser : récupérer les liens d'une page html
    Par floflo_2006 dans le forum Général Java
    Réponses: 5
    Dernier message: 13/12/2006, 01h26
  2. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  3. [RegEx] récupérer tous les liens d'une page
    Par italiasky dans le forum Langage
    Réponses: 15
    Dernier message: 08/04/2006, 18h55
  4. Réponses: 7
    Dernier message: 14/09/2005, 10h50
  5. réinitialiser les liens d'une page html
    Par sisco dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/11/2004, 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