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 :

Récupération de contenu sur un site externe


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut Récupération de contenu sur un site externe
    Bonjour à tous,

    J'essaie de récupérer du contenu qui se trouve sur un site externe.

    J'utilise une fonction curl pour récupérer le contenu entre 2 balises précises.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $curl = curl_init("http://www.exemple.com/page.html");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($curl, CURLOPT_HEADER, false);
    $page = curl_exec($curl);
    $error = curl_errno($curl);
    curl_close($curl);
    preg_match('`<div id="text">(.*?)</div>`Uis', $page, $match);
    echo $match[0];
    Le problème est que cette fonction me renvoie tout ce qui se trouve entre les balises dès la première qu'il trouve.
    Or, comment faire pour récupérer la deuxième balise qu'il rencontrerait ?

    Ex :
    J'ai ces balises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <div id="text">Mon texte 1</div>
    <div id="text">Mon texte 2</div>
    <div id="text">Mon texte 3</div>
    J'aimerai pouvoir récupérer "Mon texte 2".

    Comment faire ?

    Merci !

  2. #2
    Expert confirmé

    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
    Par défaut
    pour parser du HTML c'est avec DOMDocument

  3. #3
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    pour parser du HTML c'est avec DOMDocument
    sans vouloir contredire stealth35 sur ca méthode, juste pour info la fonction c'est preg_match_all() et tu récupères un tableau...

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    sans vouloir présumer de ce que va dire Stealth35, les regexp pour trouver des éléments dans des flux XML c'est mal.

    Déjà, avec des id multiples c'est mal barré

    Pour trouver tes éléments tu peux utiliser ce xpath:
    De cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $dom = new DOMDocument;
    $dom->loadXML($content);
     
    $xpath = new DOMXPath($dom);
    $query = "div[@id='text']";
    $nodes = $xpath->query($query);
    foreach ($nodes as $node) {
      echo "Value: " . $node->nodeValue;
    }
    Enjoy

  5. #5
    Membre émérite Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Par défaut
    mais honnêtement y a quoi comme code derrière les méthodes la ?
    y aurait pas une regexp ou deux qui trainerait par ci ou par la ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    sans vouloir présumer de ce que va dire Stealth35, les regexp pour trouver des éléments dans des flux XML c'est mal.

    Déjà, avec des id multiples c'est mal barré

    Pour trouver tes éléments tu peux utiliser ce xpath:
    De cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $dom = new DOMDocument;
    $dom->loadXML($content);
     
    $xpath = new DOMXPath($dom);
    $query = "div[@id='text']";
    $nodes = $xpath->query($query);
    foreach ($nodes as $node) {
      echo "Value: " . $node->nodeValue;
    }
    Enjoy
    C'est pour parser du xml ça aussi non ?
    Pour du html, ça fonctionne quand même ?

  7. #7
    Expert confirmé

    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
    Par défaut
    oui c'est plus loadHTMLFile qu'il faut faire (donc pas besoin de cURL non plus)

  8. #8
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    mais honnêtement y a quoi comme code derrière les méthodes la ?
    Les regexp sont utiles quand tu veux trouver des entités dans du plain-text. Dans le cadre d'un arbre XML, le DOM te fournit une structure d'accès au donnés plus optimale et plus puissante. Je n'ai jamais décompilé l'extension PHP qui y correspond donc je ne peux pas l'affirmer mais logiquement, on ne doit pas avoir de regexp là dedans.
    De plus, pour avoir implémenté les deux solutions pour faire des moteurs de templates, l'un avec regexp et l'autre avec DOM, le DOM va à la vitesse de la lumière comparé aux regexp.

  9. #9
    Expert confirmé

    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
    Par défaut
    derrière c'est comme du SAX

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Par défaut
    Ca donne un peu près ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $content = "http://www.mapage.com/test.html";
    $dom = new DOMDocument;
    $dom->loadHTMLFile($content);
     
    $xpath = new DOMXPath($dom);
    $query = "div[@id='text']";
    $nodes = $xpath->query($query);
    foreach ($nodes as $node) {
      echo "Value: " . $node->nodeValue;
    }
    J'ai une petite () erreur :
    Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseEntityRef: expecting ';' in http://www.mapage.com/test.html, line: 220 in /web/www/fonction.php on line 28

  11. #11
    Expert confirmé

    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
    Par défaut
    oui la page ne doit pas etre valide, mais pas de soucis comme c'est du en HTML, fais un libxml_use_internal_errors avant loadHTMLFile et libxml_clear_errors après

Discussions similaires

  1. récupération de donnée sur un site web
    Par Wamdeus dans le forum C#
    Réponses: 1
    Dernier message: 12/05/2010, 11h10
  2. Publication d'un même contenu sur plusieurs sites
    Par sweetdreamer dans le forum Débuter
    Réponses: 1
    Dernier message: 22/04/2010, 23h39
  3. Empecher le "vol" de contenu sur son site
    Par cadoudal56 dans le forum Sécurité
    Réponses: 10
    Dernier message: 07/03/2008, 14h50

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