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 :

Recherche sous chaines inconnues


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut Recherche sous chaines inconnues
    Bonjour à tous,

    je suis actuellement en train de réaliser un projet EN LANGAGE C (uniquement je précise pour ceux qui me conseillerait d'utiliser le PHP ça ne répond pas à mes attentes) me permettant de récupérer sur le web des liens qui m’intéresse pour les stocker sur un fichier et ne conserver que les meilleures après élimination du bruit.

    Bref pour faire simple, j'utilise les sockets pour récupérer le code source d'une recherche google avec des paramètres constituant ma requête, jusque la tout fonctionne.

    Je stocke donc dans un fichier texte tout le source de la première page google, et je voudrais ensuite conserver dans ce code uniquement les liens (une dizaine par page google), c'est à dire garder tout ce qui est contenu entre une balise href=" et " cependant je ne sais pas comment m'y prendre après avoir tout tenté durant des heures du fait que le contenu soit aléatoire.

    Auriez vous une idée ? en PHP un regex m'aurait permis de faire cela en indiquant de garder tout ce qui est contenu entre href=" et " mais en C je bloque.

    Merci d'avance, et bonne journée/nuit

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    J'aurais fait un truc comme ça:

    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
    const char* href = "href=";
    int sizehref = strlen(href);
    for(int i=0; i < bufsize; ++i)
    {
      int found = 1;
      for(int j=0; found && j < sizehref; ++j)
      {
        if(buf[j+i] != href[j])
          found = 0;
      }
      if(found)
      {
         i = read_link(bufsize[i+sizehref+1]); // +1 for the first ".
      }
    }
    je te laisse un peu réfléchir pour la fonction read_link

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Pourquoi ne pas plutôt utiliser la fonction strstr() pour trouver la position d'un lien, pour remplacer la boucle ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Merci pour ces réponses, cependant je ne pense pas que cela résoudra mon problème, certes cela va trouver le début de chaque liens (strstr() suffit effectivement pour trouver la position de chaque DEBUT de lien) contenu derrière href=" mais je dois cependant uniquement stocker le lien qui sera contenu dans le href=" et se terminant par " sachant que je ne connais pas le lien par avance(seulement la structure "début par href=" et fin avec "), et de manière automatique pour tout le fichier. Au final j'aurai uniquement un fichier texte contenant chaque liens de la première page à analyser et décortiquer.

    D'autres idée ou c'est impossible à faire dans quel cas je vais devoir trouver une autre solution?

    Exemple: extrait de fichier (dix fois plus long)à analyser pour obtenir les liens

    Code HTML : 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
    "b_32 href="http://www.google.fr/reader/view/?hl=fr&tab=wy">Reader</a></li><li cl
    ass=gbmtc><a onclick=gbar.qs(this);gbar.logger.il(1,{t:31}); class=gbmt id=gb_31
     href="http://picasaweb.google.fr/lh/view?q=programmation+systeme+liens+web+pars
    e&um=1&ie=UTF-8&hl=fr&sa=N&tab=wq">Photos</a></li><li class=gbmtc><a onclick=gba
    r.qs(this);gbar.logger.il(1,{t:12}); class=gbmt id=gb_12 href="http://www.google
    .fr/search?q=programmation+systeme+liens+web+parse&um=1&ie=UTF-8&hl=fr&tbo=u&tbm
    =vid&source=og&sa=N&tab=wv">VidÚos</a></li><li class=gbmtc><div class="gbmt gbmh
    "></div></li><li class=gbmtc><a onclick=gbar.logger.il(1,{t:66}); href="http://w
    ww.google.fr/intl/fr/options/" class=gbmt>Encore plus &raquo;</a></li></ol><div
    class=gbsbt></div><div class=gbsbb></div></div></div></li></ol></div><div id=gbg
    ><h2 class=gbxx>Account Options</h2><span class=gbtcb></span><ol class=gbtc><li
    class=gbt><a target=_top href="https://accounts.google.com/ServiceLogin?hl=fr&co
    ntinue=http://www.google.fr/search%3Fq%3Dprogrammation%2Bsysteme%2Bliens%2Bweb%2
    Bparse" onclick=
    7ba
    "gbar.logger.il(9,{l:'i'})" id=gb_70 class=gbgt><span class=gbtb2></span><span i
    d=gbgs4 class=gbts><span id=gbi4s1>Connexion</span></span></a></li><li class="gb
    t gbtb"><span class=gbts></span></li><li class=gbt><a class=gbgt id=gbg5 href="h
    ttp://www.google.fr/preferences?hl=fr" title="Options" onclick="gbar.tg(event,th
    is)" aria-haspopup=true aria-owns=gbd5><span class=gbtb2></span><span id=gbgs5 c
    lass=gbts><span id=gbi5></span></span></a><div class=gbm id=gbd5 aria-owner=gbg5
    ><div class=gbmc><ol id=gbom class=gbmcc><li class="gbkc gbmtc"><a  class=gbmt h
    ref="/preferences?hl=fr">ParamÞtres de recherche</a></li><li class=gbmtc><div cl
    ass="gbmt gbmh"></div></li><li class="gbkp gbmtc"><a class=gbmt href="http://www
    .google.fr/history/optout?hl=fr">Historique Web</a></li></ol></div></div></li></
    ol></div></div><div id=gbx3></div><div id=gbx4></div><script>window.gbar&&gbar.e
    lp&&gbar.elp()</script></div><br style="clear:all"><table border="0" cellpadding
    ="0" cellspacing="0" id="mn" style="position:relative"><div><tr><td width="157"
    rowspan="2" valign="top"><h1><a href="/webhp?hl=fr" id="logo" title="Go to Googl..."

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Il me semble qu'un squelette comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    pos=strstr(buffer,"href=\"");
    while(pos) {
      cur=++pos;
      while(*cur!='"') cur++;
      strcpy(lien,cur-pos);
      pos=strstr(cur+1,"href=\"");
    }
    devrait fonctionner (il faut ajouter un \0 à lien).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Encore merci,

    ta méthode edgarjacobs m'intrigue pas mal, cependant mon fichier analysé est un texte du coup actuellement je le traite caractère par caractère. Dois-je transformé mon fichier de type File en chaine de caractère (futur buffer) pour que la fonction strstr puisse fonctionner (effectivement premier argument attendu en char, et non en File)? Si non comment puis-je faire fonctionner ta méthode?

    Actuellement j'analysé caractère par caractère de la manière suivante :je trouve bien mes 10 occurences voulues en initialisant un compteur, mais encore des problèmes pour stocker mon lien contenue entre les balises.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     while( fread(&c,1,1,f)>0 ) {
     
        if( c==strSearch[pos] ) 
        {
    ...

  7. #7
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Je stocke donc dans un fichier texte tout le source de la première page google
    Cela métonnerait enormement si une page de résultat google ne pouvait pas tenir en mémoire... sauf, sans doute, sur un pré-précurseur des pc actuels

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut


    Oui bon vu comme ça



    Mais j'essayais de rester général......

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    Merci à tous, cela m'aide grandement, programmant aussi pas mal en PHP (bien que ce ne soit pas un langage pour beaucoup mais plus un langage de balises) j'avais pensé au regex mais je crains que la mise en place en C soit délicate.

    Je pense opter pour charger le source de la page google entièrement en mémoire puis l'analyser avec strstr jusque la fin du lien. J'ai d'ailleurs trouvé une nouvelle astuce, au lieu de prendre le lien dans le href= qui contient pleins de caractère qui ne me plaise pas j'opte pour conserver uniquement le lien contenu entre <cite> et </cite> se qui me réduira encore des erreurs.

    J'attaque donc cette partie très vite travaillant actuellement de nuit et je vous tiens au courant pour l'avancement et les résultats obtenu avec strstr ou autre si celle ci ne convient pas.

    Bonne soirée à vous

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 79
    Par défaut
    j'oubliais, de combien d'espace je dispose pour placer en mémoire mon fichier pour savoir si je peux me passer de découpe en bloc?
    Actuellement le source complet extrait (avec la lib curl) et stocké dans un fichier texte me prend 59ko et reste semblable pour toute recherche en faisant varié les paramètres de recherche (mots clefs).

  11. #11
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Il n'y a pas longtemps, j'ai mis un fichier de 4.232.506 octets en mémoire...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Recherche sous chaine dans une liste
    Par lbar012001 dans le forum Excel
    Réponses: 7
    Dernier message: 29/08/2012, 14h21
  2. Rechercher sous-chaine dans nom fichier
    Par leuke dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 17/06/2009, 17h11
  3. [PERL] Recherche sous chaine de caracteres
    Par KrSt94 dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2007, 16h25
  4. [Regex] Recherche sous chaine, debutant
    Par Tekone dans le forum Langage
    Réponses: 1
    Dernier message: 14/06/2006, 00h18
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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