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 PHP Discussion :

Problème de capture avec preg_match_all() dans un résultat de Curl


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Points : 56
    Points
    56
    Par défaut Problème de capture avec preg_match_all() dans un résultat de Curl
    Bonjour à tous,

    J'ai un problème pour capturer le contenu d'une balise issue d'une page récupérée avec Curl.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content = recuperer_page_http($v['adr1'].$plus.$v['adr2'], 10,'','');
    J'ai testé le retour de ma fonction "recuperer_page_http" qui utilise Curl et elle me retourne la page html passée en paramètre en un "string" contenant l'ensemble de la page

    De cette page j'aimerais en extraire des données spécifiques, pour ça j'ai identifié des noms de classe de balise de la page qui entoure mon information.

    Voici le patern que j'ai créé pour mon preg_match_all ce ui me permet de récupérer le contenu de la balise "dd" avec la classe "pdg_b_sm"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content = preg_match_all("#<dd class=\"pdg_b_sm\">.*</dd>#",$content,$resultats,PREG_PATTERN_ORDER);
    Puis je l'affiche comme cela pour voir les résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($resultats[0] as $result) {
     print_r(htmlentities($result));// store each $result in database or create a new spider to spider next page
    }
    Résultat des courses, tout ce code m'affiche 20 fois (nombre d'occurences trouvé dans la page) le string "<dd class="pdg_b_sm"></dd>" Alors que ce que je veux isoler, c'est justement le contenu de cette balise.

    Si vous pouvez m'apporter de l'aide en ce qui concerne mon problème ça serait sympa, j'ai appris les expressions régulières depuis peu et la fonction preg_match_all() aussi, mais ça fait 2 jours que je m'arrache les cheveux. Pourtant je suis certain de ne pas être loin de la solution...

    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    pour parser du HTML c'est DOMDocument

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Points : 56
    Points
    56
    Par défaut
    J'ai déjà vu une réponse similaire de toi dans d'autres topics concernant ce sujet et j'ai commencé à lire la doc PHP sur DOMDocument mais je suis sur un projet de site "comparatif de prix" et j'aurai besoin de faire cette extraction sur plusieurs sites à la fois après la requète d'un utilisateur...

    DOMDucument ne serait pas trop lourd niveau ressource pour mon besoin ?

    Je ne suis pas contre changé de techno pour mon projet mais mes preg_match me semblait plus léger...

    Après je me trompe peut être...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    DOMDocument est plus simple a utiliser et a comprendre que les regex, de plus que c'est fait pour ça
    Pour la requete Xpath ca donnera : //dd[@class="pdg_b_sm"]

    essaye aussi de voir, si ton site ne propose pas une API

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 81
    Points : 56
    Points
    56
    Par défaut
    Les sites que je veux "scanner" ne propose pas d'API il s'agit d'un marché trop petit et les sites ne sont pas vraiment évolués.

    Je vais suivre ton conseil, je vais commenté tous mes preg_match pour le moment et je vais me lancer dans DOMDocument (j'ai quand même appris toute la syntaxe des expression régulière POSIX et PCRE pour rien mais bon, ça pourra toujours servir je me suis fait des fiches récapitulatives ^^)

    Merci pour le Xpath de ma requête mais je vais quand même être obligé de la déchiffrer et d'en comprendre la syntaxe sinon ça sert à rien... je crois que j'ai une nouvelle syntaxe à apprendre !

    En tout cas merci pour tes réponses rapides !

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 96
    Points
    96
    Par défaut
    Premièrement, pour isoler l’intérieur, mets des parenthèses autour de ton .* ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "#<dd class=\"pdg_b_sm\">(.*)</dd>#"
    Deuxièmement, je rajouterai un ? apres ton .* pour bien spécifier que tu ne veux qu'une seule balise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <dd> : "#<dd class=\"pdg_b_sm\">(.*?)</dd>#"
    Troisièmement, cela ne fonctionnera malheureusement pas si tu as des balises <dd> imbriquées les unes dans les autres telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <dd class=\"pdg_b_sm\"><dd class=\"pdg_b_sm\">bla-bla</dd></dd>
    Si tu connais la strucuture de ton site j'imagine que mon troisièmement ne te pose aucun problème ^^

    sinon pour répondre à ta question... a moins qu'il y ai 20 fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<dd class="pdg_b_sm"></dd>"
    dans la page il y a effectivement un problème, sauf bien sur si ces balises ne contiennent que du code html et que ce code soit interprété sur la page de visualisation .

    Teste déjà avec (.*?) et dis nous si ca change vraiment quelque chose.

Discussions similaires

  1. Problème de session avec IE dans script php facebook
    Par worms_33 dans le forum Facebook
    Réponses: 2
    Dernier message: 27/05/2012, 17h59
  2. Problème Trendnet 422W avec zoneMinder dans virtualBox
    Par doudoubens dans le forum Matériel
    Réponses: 0
    Dernier message: 05/01/2011, 17h27
  3. Problème ouverture connection avec ACCESS dans VB.net
    Par Angelique64 dans le forum VB.NET
    Réponses: 5
    Dernier message: 25/04/2010, 19h47
  4. [DisplayTag] problème d'utilisation avec glassfish dans un projet EJB
    Par wl1979 dans le forum Taglibs
    Réponses: 0
    Dernier message: 14/04/2009, 13h35
  5. Réponses: 13
    Dernier message: 01/12/2005, 06h34

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