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 :

[SimpleXML] Parser uniquement une partie d'un tableau


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 45
    Points : 18
    Points
    18
    Par défaut [SimpleXML] Parser uniquement une partie d'un tableau
    Bonjour @ tous,

    Je souhaiterais "parser" une partie d'un tableau présent à l'adresse suivante : http://grenoble.stats.pointstreak.co...standings.html
    J'utilise PHP Simple HTML DOM Parser.

    Je débute dans ce domaine du "parser", et je n'ai réussi qu'à faire un simple "echo" du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    $html = file_get_html('http://grenoble.stats.pointstreak.com/templatepreview/standings.html');
    foreach($html->find('.tablelines') as $classement);
    	echo $classement;
    ?>
    Je souhaiterais "parser" uniquement les colonnes "RG", "Equipe", "MJ" et "Points". C'est à dire que les autres colonnes seront invisibles.

    Pourriez vous s'il vous plait m'indiquer la démarche à suivre afin d'isoler uniquement ces colonnes.

    Merci d'avance !

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je ne vois pas la nécessité de se mettre à travailler avec encore d'une bibliothèque PHP Simple HTML DOM Parser de plus. On peut simplement utiliser DOMDocument et SimpleXML (naviguer entre les deux pour en profiter les facilités plus soustenues ...)

    Voici une demo de concept profitant la structure spécifique de la page en question. Si on veut quelques choses de plus générales, il y a de quoi à regarder et de temps à investir.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $surl="http://grenoble.stats.pointstreak.com/templatepreview/standings.html";
    $doc=new DOMDocument();
    $bret=$doc->loadHtmlFile($surl);
    if (!$bret) {
        echo 'Erreurs rencontrées en parsant le document, impossible de continuer ...', "\n";
        exit;
    }
    $simplexml=simplexml_import_dom($doc);
    $result=$simplexml->xpath("//table[@class='tablelines']/tr[position() > 1]/td[position()=1 or position()=2 or position()=3 or position()=9]");
    $n=1;
    while(list( , $node) = each($result)) {
        echo trim(dom_import_simplexml($node)->textContent), ($n % 4 == 0 ? "\n" : ',');
        $n++;
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Merci tsuji.

    Je ne savais pas qu'il était possible de se passer de bibliothèque supplémentaire. Je viens de tester ton code, et ça fonctionne, mais j’obtiens un ligne de données et non un tableau.

    Est-ce normal ? Ai-je manqué quelque chose ? Si non, pourrais-tu me guider afin de transformer ces données en tableau ?

    Merci d'avance.

    PS :
    J'ai modifié un peu ton code pour qu'il pointe vers les "Pts" et non les "% d'arrêts" sur cette ligne (j'ai passé la dernière position de 9 à 8) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result=$simplexml->xpath("//table[@class='tablelines']/tr[position() > 1]/td[position()=1 or position()=2 or position()=3 or position()=8]");

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Si vous voulez retourner comme un tableau au sens html, c'est fait peut-on-dire comme d'habitude une fois les données étant en main ... (mais php n'est pas forcément au service de html, bien entendu).

    Pour ne rendrement html, on peut le faire comme ça et vous ajoutez les stylistiques comme vous voulez dessus.
    Code php : 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
    $doc=new DOMDocument();
    $bret=$doc->loadHtmlFile($surl);
    if (!$bret) {
        echo '<div>Error while parsing the document</div>';
        exit;
    }
    $simplexml=simplexml_import_dom($doc);
    $result=$simplexml->xpath("//table[@class='tablelines']/tr/td[position()=1 or position()=2 or position()=3 or position()=8]");
     
    $n=1;
    echo '<table border="1">';
    while(list( , $node) = each($result)) {
        echo ($n % 4 == 1 ? '<tr>' : '');
        echo '<td>', trim(dom_import_simplexml($node)->textContent), '</td>', ($n % 4 == 0 ? '</tr>' : '');
        $n++;
    }
    echo '</table>';

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Tsuji, merci une nouvelle fois pour ton aide.

    Je reviens vers toi, pour savoir s'il est possible de mettre en gars dynamiquement une données du tableau.

    Par exemple, Rouen est classé 9ème dans le tableau, je souhaiterais le mettre en gras et que cette mise en forme soit conservée même si la position dans le tableau change.

    Est-ce possible avec SimpleXML ?

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Si on veut ajouter un style très localizé, on peut ajouter un style "inline". Si il y a beaucoup de cas, ça risque d'être ennuyeux. Pour le cas de Rouen, c'est fait comme ça.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(list( , $node) = each($result)) {
        $data=trim(dom_import_simplexml($node)->textContent);
        echo ($n % 4 == 1 ? '<tr>' : '');
        if ($data=='Rouen') {
            echo '<td style="font-weight:bold;">', $data, '</td>', ($n % 4 == 0 ? '</tr>' : '');
        } else {
            echo '<td>', $data, '</td>', ($n % 4 == 0 ? '</tr>' : '');
        }
        $n++;
    }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Est-il possible plutôt de mettre en gras la ligne complète ? (avec la position, les points etc...)

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    On peut toujours stocker les données pour chaque ligne et faire le contrôl après.
    Code php : 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
    $n=1;
    $data=array();
    echo '<table border="1">';
    while(list( , $node) = each($result)) {
        $data[$n % 4] = trim(dom_import_simplexml($node)->textContent);
        if ($n % 4 == 0) {
            if ($data[2] == 'Rouen') {
                echo '<tr style="font-weight: bold;">' ;
            } else {
                echo '<tr>' ;
            }
            foreach ($data as $d) {
                echo '<td>', $d, '</td>';
            }
            echo '</tr>';
        }
        $n++;
    }
    echo '</table>';
    C'est à titre d'exemple. Vous pouvez le améliorer ...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Encore une fois merci Tsuji !

    J'ai encore 4 questions :

    1. Je souhaiterais ajouter une colonne "vide" depuis le fichier PHP (donc sans faire un appel avec simplexml). Est-ce possible.
    Exemple :
    RG ***VIDE*** Equipe MJ Pts.
    1. ***VIDE*** Rouen 26 40
    2. ***VIDE*** Grenoble 26 40


    2. Je souhaiterais mettre une fond de couleur pour les 4 premiers du classement et les 2 derniers du classement.

    3. Est-il possible d'avoir pour chaque colonnes du tableau un style particulier (par exemple un alignement centré ou non).

    4. As tu un compte PayPal ou autre pour que je t’envoie un petit quelque chose pour ta précieuse aide.

    Merci !

    EDIT :

    Voici ce qui je souhaiterais faire au final :
    Nom : Capture.JPG
Affichages : 147
Taille : 23,4 Ko

    1ère colonne > Position, avec alignement centré des chiffres.

    2ème colonne > Petit logo des équipes (il s'agit de la fameuse colonne que je souhaiterais ajouter en plus). Ces petits logos seraient rattacher au nom des équipes. Donc si les équipes changent de positions, les logos suivent. Alignement centré.

    3ème colonne > Nom des équipes, avec alignement sur la gauche.

    4ème colonne > Nombre de matchs joués, avec alignement centré.

    5ème colonne > Nombre de points, avec alignement centré.

    Pensez-vous que c'est faisable ou trop compliqué ?
    Merci beaucoup, beaucoup, beaucoup !!

  10. #10
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je n'ai pas regardé en détail les nouvelles questions; mais j'ai bien une impression soit elles sont liées aux stylistiques ce qui sont illustrés par l'insertion dynamique du style font-weight, soit elles sont liées aux comptages de colonnes ce qui sont illustrées pas des tr et td ici ou là. Je pense tu est prêt d'en faire toi-même. En ce qui concernent les stylistiques, si tu ne connait pas trop css/xhtml, il faut s'approfondir les savoir-faires par des études supplémentaires, bien entendu.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Bonjour de nouveau,

    J'ai un peu compris comment parser. Aujourd'hui je tombe sur un problème. Je souhaiterais parser un nouveau tableau, sauf que sur la même page, deux tableaux existent avec la même "class".

    Comment puis-je fais pour avoir uniquement le premier tableau ? Merci.

    Voici le lien en question : http://grenoble.stats.pointstreak.co...seasonid=14651

  12. #12
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Dans le cas où l'attribut @class ne suffit à selection un tableau unique ciblé et qu'on veut sélectionner le premier (ou l'un parmi eux selon le même principe), on peut ajouter un index (base-1) comme prédicat du xpath, comme ceci.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //$result=$simplexml->xpath("//table[@class='tablelines']/tr/td[position()=1 or position()=2 or position()=3 or position()=8]");
    $result=$simplexml->xpath("//table[@class='tablelines'][1]/tr/td[position()=1 or position()=2 or position()=3 or position()=8]");
    et voilà !

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/09/2007, 18h54
  2. Scrollbar sur une partie d'un tableau
    Par Dams59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/04/2007, 09h40
  3. [HTML] Rafraichir uniquement une partie d'un page html
    Par andlio dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/03/2006, 15h40
  4. [Tableau] récupérer une partie d'un tableau
    Par keyra dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 07/02/2006, 22h17
  5. passer une partie d'un tableau en paramettre.
    Par monstroplante dans le forum Langage
    Réponses: 13
    Dernier message: 04/11/2005, 01h22

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