Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer les données d'un site web externe

    6 mars 2015 à 20:30:34

    Bonsoir à toutes et tous,voila mon problème : 

    Je débute en php et notamment sur les regex... (j'ai des connaissance en html-css et javascript...)

    Je souhaite récupérer les valeurs du classement du site suivant : http://www.soccerstats.fr/latest.asp?league=england, par exemple comment je pourrais faire pour récupérer juste le nombre de match gagné par l'équipe Chelsea (ici 19)...

    J'ai du mal a savoir comment retourner une valeur entre des balises et surtout comment faire pour dissocier toutes les balises <tr>Valeur </tr> les unes des autres. J'ai cru comprendre qu'il existait des petits programmes qui permettent de créer un regex mais je ne trouve pas de ressources...

    J'espère que ma question n'est pas trop flou, je débute en php...

    Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      6 mars 2015 à 21:34:21

      Voila le code que j'essaye : 
      <!DOCTYPE html> 
      <html> 
        <head> 
            <title>test</title>
            <meta charset="UTF-8"> 
        </head> 
            <header> 
         
            </header> 
         
            <body> 
              <span>
              <?php
                $source = file_get_contents("http://www.soccerstats.fr/latest.asp?league=england");
                preg_match('#[0-40]#',$source, $result);
                echo $result[0];
              ?>
            </span>
            </body>
         
      </html>

      Il renvoie 3, je pense que c'est  le 3 de la premiere ligne du fichier source du site : <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

      Je pensais que echo $result[0]; aller me renvoyer la premiere occurence mais si je met echo $result[1] il ne renvoie pas 4...

      • Partager sur Facebook
      • Partager sur Twitter
        6 mars 2015 à 22:39:21

        Bonjour Jean,

        Voici ce que tu dois faire. c'est bidouille mais ca fonctionne très bien.

        <?php
        /**
         * Created by PhpStorm.
         * User: Antho
         * Date: 06/03/2015
         * Time: 22:08
         */
        
        
        $content = file_get_contents ('http://www.soccerstats.fr/latest.asp?league=england');
        
        if($content) {
            /*
             * Récupération de <div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">
             * Jusqu'a script async
             */
            preg_match('`<div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">(.+)script async`isU', $content, $divContent);
            $divContent =  ($divContent[1]); // Renvois le tableau complet
        
            $trExplose = explode("<tr class='odd'>", $divContent);
        
        
            $i = 0;
            foreach ($trExplose as $contenu) {
                if ($i > 0) {
                    $cnt = explode("<td align='center'>", $contenu);
                    $j = 0;
                    foreach ($cnt as $final) {
                        $final = strip_tags($final);
        
                        if ($j == 0) {
                            echo '<strong>' . $final . '</strong>';
                        }
                        if ($j == 3) {
                            echo $final;
                            echo '<br />';
                        }
                        $j++;
                    }
                    echo '<hr />';
                }
            $i++;
            }
        }



        • Partager sur Facebook
        • Partager sur Twitter
          6 mars 2015 à 22:42:14

          Ce code te sortira un tableau :

          1  Chelsea 19 
          2  Manchester City 17 
          3  Arsenal 16 
          4  Manchester Utd 15 
          5  Liverpool 15 
          6  Southampton 15 
          7  Tottenham 14 
          8  Stoke City 12 
          9  Swansea City 11 
          10  West Ham Utd 10 
          11  Newcastle Utd 9 
          12  Crystal Palace 7 
          13  West Bromwich 7 
          14  Everton 6 
          15  Hull City 6 
          16  Sunderland 4 
          17  Aston Villa 6 
          18  QP Rangers 6 
          19  Burnley 4 
          20  Leicester City 4 
          



          • Partager sur Facebook
          • Partager sur Twitter
            7 mars 2015 à 11:40:58

            Merci pour ta réponse, est-ce que tu pourrais me détaillez ce qu'est le script async et le 'isU' dans le regex et aussi les deux boucle foreach stp? Pour le reste j'imagine que la documentation est bien fournis je trouverais par moi même merci :)

            EDIT : Ce que tu ma donné ne fonctionne pas chez moi

            -
            Edité par JeanMimimi 7 mars 2015 à 11:49:12

            • Partager sur Facebook
            • Partager sur Twitter
              7 mars 2015 à 11:50:04

              Avec Plaisir

              <?php
              /**
               * Created by PhpStorm.
               * User: Antho
               * Date: 06/03/2015
               * Time: 22:08
               */
               
               
              $content = file_get_contents ('http://www.soccerstats.fr/latest.asp?league=england');
               
              if($content) {
                  /*
                   * Récupération de <div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">
                   * Jusqu'a script async
                   */
                  preg_match('`<div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">(.+)script async`isU', $content, $divContent);
                  $divContent =  ($divContent[1]); // Renvois le tableau complet
              	
              	
                  /*
                   * Pour le moment, nous avons tout le tableau <div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;"> jusqu'a script async (qui est la publicité Google sous la tableau)
                   * script async, j'ai prix cette référence car si j'avais fait
              	 *  preg_match('`<div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">(.+)</div>`isU', $content, $divContent);
              	 * le preg_match aurait pris uniquement la première fermeture de div trouvée
                   */	
                  $trExplose = explode("<tr class='odd'>", $divContent); /* explode les élements <tr class='odd'> pour en faire un tableau */
               
               
                  $i = 0;
              	/* Boucle des élements du tableau trExplose */
                  foreach ($trExplose as $contenu) {
                      if ($i > 0) {
                          $cnt = explode("<td align='center'>", $contenu); /* explode les élements <td align='center'> pour un tableau*/
                          $j = 0;
              			/* Boucle des elements td du tableau $cnt */
                          foreach ($cnt as $final) {
                              $final = strip_tags($final); /* Pour enlever tous les balsies html */
              				
              				
                              if ($j == 0) { /* Le premier affiche le titre */
                                  echo '<strong>' . $final . '</strong>';
                              }
                              if ($j == 3) { /* Celui ci affiche le nombre de matchs gagnés */
                                  echo $final;
                                  echo '<br />';
                              }
                              $j++;
                          }
                          echo '<hr />';
                      }
                  $i++;
                  }
              }



              • Partager sur Facebook
              • Partager sur Twitter
                7 mars 2015 à 11:50:38

                Ton problème est t'il résolu ?
                • Partager sur Facebook
                • Partager sur Twitter
                  7 mars 2015 à 12:00:16

                  Merci beaucoup, je pense avoir compris ce que tu as fait, cependant cela ne marche toujours pas chez moi, voila mon code en entier : 

                  <!DOCTYPE html> 
                  <html> 
                    <head> 
                        <title>test</title>
                        <meta charset="UTF-8"> 
                    </head> 
                        <header> 
                     
                        </header> 
                     
                        <body> 
                          <span>
                          <?php
                  /**
                   * Created by PhpStorm.
                   * User: Antho
                   * Date: 06/03/2015
                   * Time: 22:08
                   */
                    
                    
                  $content = file_get_contents ('http://www.soccerstats.fr/latest.asp?league=england');
                    
                  if($content) {
                      /*
                       * Récupération de <div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">
                       * Jusqu'a script async
                       */
                      preg_match('`<div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">(.+)script async`isU', $content, $divContent);
                      $divContent =  ($divContent[1]); // Renvois le tableau complet
                       
                       
                      /*
                       * Pour le moment, nous avons tout le tableau <div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;"> jusqu'a script async (qui est la publicité Google sous la tableau)
                       * script async, j'ai prix cette référence car si j'avais fait
                       *  preg_match('`<div id="league-table-data" style="text-align:center;margin-top:6px;clear:both;">(.+)</div>`isU', $content, $divContent);
                       * le preg_match aurait pris uniquement la première fermeture de div trouvée
                       */
                      $trExplose = explode("<tr class='odd'>", $divContent); /* explode les élements <tr class='odd'> pour en faire un tableau */
                    
                    
                      $i = 0;
                      /* Boucle des élements du tableau trExplose */
                      foreach ($trExplose as $contenu) {
                          if ($i > 0) {
                              $cnt = explode("<td align='center'>", $contenu); /* explode les élements <td align='center'> pour un tableau*/
                              $j = 0;
                              /* Boucle des elements td du tableau $cnt */
                              foreach ($cnt as $final) {
                                  $final = strip_tags($final); /* Pour enlever tous les balsies html */
                                   
                                   
                                  if ($j == 0) { /* Le premier affiche le titre */
                                      echo '<strong>' . $final . '</strong>';
                                  }
                                  if ($j == 3) { /* Celui ci affiche le nombre de matchs gagnés */
                                      echo $final;
                                      echo '<br />';
                                  }
                                  $j++;
                              }
                              echo '<hr />';
                          }
                      $i++;
                      }
                  }?>
                        </span>
                        </body>
                     
                  </html>
                  



                  -
                  Edité par JeanMimimi 7 mars 2015 à 12:00:48

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    7 mars 2015 à 17:13:44

                    Bonjour
                    J'ai testé le code ci-dessus et il me semble fonctionnel car j'obtiens:
                    1  Chelsea 19 
                    2  Manchester City 17 
                    3  Arsenal 16 
                    4  Manchester Utd 15 
                    5  Liverpool 15 
                    6  Southampton 15 
                    7  Tottenham 14 
                    8  Stoke City 12 
                    9  Swansea City 11 
                    10  West Ham Utd 10 
                    11  Newcastle Utd 9 
                    12  Crystal Palace 7 
                    13  West Bromwich 7 
                    14  Everton 6 
                    15  Hull City 6 
                    16  Sunderland 4 
                    17  Aston Villa 6 
                    18  QP Rangers 6 
                    19  Burnley 4 
                    20  Leicester City 4
                    Un var_dump($contenu); avant le if($contenu) permettrait de voir si file_get_contents() a un problème pour accéder à internet chez toi. Il y a allow_url_fopen qui doit-être à on dans "php.ini". Ensuite si c'est vraiment chez toi et non sur ton serveur web, alors il y a peut-être un firewall qui bloque apache vers internet.
                    Il arrive qu'un site offre ce genre de contenu en feed xml ou rss en échange d'un lien, ce qui t'éviterait de tout recommencer quant le design du site change.

                    -
                    Edité par Anonyme 7 mars 2015 à 17:15:12

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mars 2015 à 20:16:42

                      C'est en effet bizarre car si ta première requête te sort un résultat. aucune raison que celle-ci ne sorte rien.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mars 2015 à 15:59:39

                        Je suis sur Macbook pro et j'utilise MAMP pour mes php, qu'est ce que le php.ini ?

                        EDIT : Alors en fait, il y a quelque chose de bizarre : quand je tape au clavier la ligne echo "blabla"; cela fonctionne parfaitement, mais quand je copie-colle le echo ne se met pas de la même couleur comme si il n'était pas reconnu (j'utilise Sublime Text 2 pour ceux qui connaissent.) et cela ne marche pas...

                        Je pensais à une erreur de syntaxe mais je réécrit les même lignes à l'identique...

                        -
                        Edité par JeanMimimi 8 mars 2015 à 16:15:34

                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 mars 2015 à 16:23:02

                          J'ai réussi a résoudre le problème du echo qui change de couleur :) mais cela ne change rien, j'ai enlever mon coupe-feu cela ne change rien non-plus. Cependant je ne sais pas ce qu'est le php.ini... Quand je met le var_dump($content) rien ne se passe.

                          EDIT : j'ai trouver le php.ini, et le allow_url_fopen est bien sur On

                          -
                          Edité par JeanMimimi 8 mars 2015 à 16:25:30

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            8 mars 2015 à 17:07:33

                            Bonjour

                            Le site peut prendre quelques secondes à répondre, un test qui devrait afficher au moins une erreur après FIN:

                            <!DOCTYPE html>
                            <html>
                              <head>
                                  <title>test</title>
                                  <meta charset="UTF-8">
                              </head>
                                  <header>
                                
                                  </header>
                                
                                  <body>
                                    <span>
                            <?php
                            
                            ini_set('display_errors', 'on');
                            error_reporting(E_ALL | E_STRICT);
                            echo 'DÉBUT<hr/>';
                            var_dump( file_get_contents('http://www.soccerstats.fr/latest.asp?league=england') );  
                            echo '<hr/>FIN', 22/0;
                            
                            ?>
                            
                                  </span>
                                  </body>
                                
                            </html>

                            Comme tu as localisé php.ini, tu peux vérifier si display_errors est à on et que error_reporting est au moins à E_ALL.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Récupérer les données d'un site web externe

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown