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

Bibliothèques et frameworks PHP Discussion :

[DOM] Récupération du contenu d'une class


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut [DOM] Récupération du contenu d'une class
    Bonjour,

    j'ai le code suivant qui doit me permettre de parser, chacune des 10 pages de mon site, en extrayant le contenu des div portant la class "ma_class".

    or il n'affiche rien...

    merci pour votre aide !!


    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
     
     
    for ($page=0; $page<10; $page++) {
     
    	$url="http://monsite.com/?page=".$page;
    // Ce lien est correct
     
    	$doc = new DOMDocument();
    	$doc->loadHTMLFile($url);
     
    	$xpath = new DomXpath($doc);
    	$search = $xpath->query('//div[@class="ma_class"]');
     
    			for ($i=0; $i<$search->length; $i++) {
     
    			$titre = $xpath->query('//div[@class="ma_class"]')->item($i)->nodeValue;
    			echo $titre .";";
    	}
     
    }

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    Essaie ça pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for ($page=0; $page<10; $page++) {
    	$url = "http://monsite.com/?page={$page}";
     
    	$doc = new DOMDocument;
    	$doc->loadHTMLFile($url);
    	$xpath = new DOMXPath($doc);
     
    	$nodes = $xpath->query('//div[@class="ma_class"]');
    	foreach ($nodes as $node) {
    		echo $node->nodeValue;
    	}
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Curieux, toujours rien d'affiché.

    Pourtant la variable $url est correcte et "<div class="ma_class"> existe bien dans le document HTML.

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    Bon allez c'est parti pour le débug bien cradingue

    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
    ini_set('display_errors', 1);
    error_reporting(-1);
     
    header('Content-Type: text/plain');
     
    for ($page=0; $page<10; $page++) {
    	$url = "http://monsite.com/?page={$page}";
            var_dump($url);
     
    	$doc = new DOMDocument;
    	$doc->loadHTMLFile($url);
    	var_dump($doc->saveHTML());
     
            $xpath = new DOMXPath($doc);
     
    	$nodes = $xpath->query('//div[@class="ma_class"]');
            var_dump($nodes->length);
    	foreach ($nodes as $node) {
                    var_dump($node);
    		echo $node->nodeValue;
    	}
            var_dump('------- NEXT ---------');
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    string(44) 
    URL
     
    Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: Unexpected end tag : div in URL, line: 57 in /home/monURL/index.php on line 44
     
    Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: error parsing attribute name in URL, line: 111 in /home/monURL/index.php on line 44
    bool(false) int(0) string(22) "------- NEXT ---------"
    voilà le message d'erreur

    il s'agit de ces 2 lignes répétées plein de fois
    (bien sûr à la place de URL et monURL ce sont de vraies URL, hein

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est parce que le flux HTML renvoyé par cette URL est invalide que DOMDocument refuse de le charger.

    Tu peux tenter et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $doc->strictErrorChecking = false;

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Ici ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $doc = new DOMDocument;
    	$doc->loadHTMLFile($url);
    	$doc->recover = true;
    	$doc->strictErrorChecking = false;
    	var_dump($doc->saveHTML());
    Cela dit, il m'est déjà arrivé de parser une page HTML invalide, ça affichait bien des messages d'erreur mais le parsing fonctionnait quand même...

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    Non juste après avoir instancié DOMDocument.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Malheureusement les messages persistent :/

  10. #10
    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 726
    Points
    10 726

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    les erreurs disparaissent, mais je ne comprends toujours pas pourquoi le parsing ne marche pas...

  12. #12
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    Corrige tes page pour qu'elles passent le validateur W3C. C'est tout ce qu'il te reste à faire.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Le problème c'est que ne ce sont pas mes pages...

    Bon je vais creuser de mon côté, merci pour ton aide !

  14. #14
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut,
    peux-tu retenter le code de Benjamin mais en faisant plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $doc = new DOMDocument;
    $doc->loadHTMLFile($url);
    var_dump($doc);
    si tu obtiens false c'est que le problème vient définitivement du parsing de la page et non pas de l'expression XPath qui ne retournerait rien.

    Sinon pour info, la 2e requête de la 2e boucle dans ton code est inutile car l'expression //div[@class="ma_class"] est censée te retourner déjà tous les noeuds il me semble.

    loadHTMLFile résout pas mal de problèmes lors de la construction de l'arbre DOM à partir de documents mal formés, ce que je veux dire par là c'est que les erreurs ne sont pas forcément critiques.
    Vive les roues en pierre

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Sur le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	$doc = new DOMDocument;
    	$doc->loadHTMLFile($url);
    	var_dump($doc);
    j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object(DOMDocument)#1 (0) { }

  16. #16
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    On dirait donc que le document est finalement construit. Si tu fais ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($doc->getElementsByTagName('div')->length);
    est-ce que tu as bien un chiffre différent de 0 ? qui devrait correspondre au nombre de div total dans ta page.
    Vive les roues en pierre

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    Oui il affiche 19 div


  18. #18
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Tu peux aussi vérifier avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo htmlentities($doc->saveHTML());
    que cela génère bien le HTML.
    Ce qui est bizarre c'est que ça retournait false quand tu as fait le premier test avec le code de Benjamin. Je ne vois aucune raison pour que var_dump($doc) retourne bien l'identifiant du DOMDocument mais que $doc->saveHTML() ne fonctionne pas.

    Si echo htmlentities($doc->saveHTML()); fonctionne tu pourrais vérifier de nouveau que tu as bien des <div class="ma_class"> dedans. Au final, c'est peut-être l'expression XPath qui ne retourne rien.
    Vive les roues en pierre

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 122
    Points : 38
    Points
    38
    Par défaut
    htmlentities ne retourne rien !

  20. #20
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Dernière tentative :/ est-ce que tu n'aurais pas une autre erreur que l'une des 2 que tu as citées :

    Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: Unexpected end tag : div in URL, line: 57 in /home/monURL/index.php on line 44

    Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: error parsing attribute name in URL, line: 111 in /home/monURL/index.php on line 44
    car aucune des 2 ne semble critique, en tout cas sous ma version de PHP, ceci fonctionne par exemple :

    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
    <html>
    <head>
    <title></title>
    </head>
    <body>
        <p>
        </div>
    <gagu
        <div class="ma_class">(1)<div class="ma_class">(1.1)</div></div>
    <div class="ma_class">(2)<div class="ma_class">(2.1)</div></div>
    <div class="ma_class">(3)</div>
    </body>
    </html>
    <?php
    $doc = DOMDocument::loadHTMLFile("index.php");
    var_dump($doc);
    echo htmlentities($doc->saveHTML());
     
    var_dump($doc->getElementsByTagName('div')->length);
     
    $xpath = new DomXpath($doc);
    $search = $xpath->query('//div[@class="ma_class"]');
     
    for ($i = 0; $i < $search->length; $i++) {
        $class = $search->item($i)->nodeValue;
        echo "<br>div class : ".$class;
    }
    Sinon peux-tu poster le lien ou le code HTML de l'une des pages qui pose problème (ou par MP si tu préfères) ?
    Vive les roues en pierre

Discussions similaires

  1. Récupération d'objet d'une class à l'autre
    Par mamatt dans le forum Général Java
    Réponses: 7
    Dernier message: 04/01/2008, 16h12
  2. Réponses: 2
    Dernier message: 30/11/2007, 14h14
  3. [DOM] Récupérer les attributs d'une classe CSS ?
    Par titoumimi dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 10/07/2007, 15h33
  4. recuprer le contenu d'une classe dans une ennumeration
    Par RBOUKACEM dans le forum ASP.NET
    Réponses: 4
    Dernier message: 23/02/2007, 11h28

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