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

JavaScript Discussion :

Parser une page web en JS


Sujet :

JavaScript

  1. #21
    Invité
    Invité(e)
    Par défaut
    N'inversez pas les rôles, SVP.
    Watilin a voulu gentillement m'expliquer que je voyait le problème "à l'envers" quand j'ai expliqué que le JavaScript n'était pas le plus approprié. Et les réponses qui précèdent ne parlent pas d'un autre langage, vous avez tous chercher à résoudre le problème en JavaScript (ou à l'aide de plugins Firefox, comme GreaseMonkey, pour un problème où l'une des contraintes de base était IE8).
    Le têtu de l'histoire c'est l'auteur du post, mais on lui a peut être demandé de faire un truc en mode D&K.
    Enfin le problème était intéressant.
    Bonjour chez vous.

  2. #22
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Watilin a proposé d'utiliser ActiveX puis un script PHP. Quant à l'auteur :
    le JS s'il pose problème, je suis ouvert à toute proposition, mais je parlais de JS uniquement pour ne pas demander à des développeurs un truc tout prêt mâché et faire mon fainéant ! Mais je suis ouvert à tout autre langage ou solution !


    Je ne suis pas sûr qu'il apprécie être traité comme "le têtu de l'histoire" alors qu'il s'est montré très ouvert.

  3. #23
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Je n'ai pas suggéré de passer par un serveur, j'ai simplement souligné que c'est en passant par un serveur que YQL semble contourner par magie la limitation cross-domain.

    Je reconnais volontiers que je suis têtu avec JavaScript, mais hey, nous sommes sur le forum JavaScript
    Et je vais même encore plus loin : je suis têtu avec Vanilla JS. J'ai moi aussi fait une PoC. C'est un fichier html local, je l'ai testé avec IE8/XP avec les paramètres de sécurité par défaut.

    Code html : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    <!DOCTYPE html>
    <html lang=fr>
    <head>
       <meta charset=utf-8>
       <title>Requête Ajax local vers Net avec un ActiveX</title>
       <style>
     
    body { font-family: Verdana, sans-serif;
           font-size: 100%; }
     
    table { border-collapse: collapse;
            width: 48%;
            display: inline-block;
            margin: 1%;
            background: #0A1E61;
            color: white;
            text-align: center;
            font-size: 70%; }
     
    thead  { background: black; }
    tr.odd { background: #084B96; }
     
    th { font-weight: normal;
         padding: 4px 1em; }
    td { padding: 0.7em 1em; }
     
    #error { color: red; }
     
       </style>
    </head>
    <body>
     
    <p>
       <label>Gare&nbsp;:
          <input type="text" id="gare" value="Caen">
       </label>
       <button id="bouton">Afficher</button>
    </p>
    <p id="erreur"></p>
    <div id="resultat"></div>
     
    <script>
     
    var serviceUrl = "http://www.ter-sncf.mobi/station/detail?uic=87444000";
     
    var $gare = document.getElementById("gare");
    var $bouton = document.getElementById("bouton");
    var $erreur = document.getElementById("erreur");
    var $resultat = document.getElementById("resultat");
     
    $bouton.attachEvent("onclick", function( event ){
       $resultat.innerHTML = "";
       $erreur.innerHTML = "";
       
       var gareParam = "&name=" + $gare.value;
       
       requestAndPrint(serviceUrl + gareParam, "departures");
       requestAndPrint(serviceUrl + gareParam, "arrivals");
    });
     
     
    function requestAndPrint( url, type ){
       var req = new ActiveXObject('MSXML2.XMLHTTP.3.0');
       req.open("GET", url + "&type=" + type);
       req.onreadystatechange = function( ){
          if (req.readyState < 4) return;
          if (200 !== req.status) {
             $erreur.innerText = "Requête échouée, code = " + req.status;
          } else {
             transform(req.responseText, type);
          }
       };
       req.send(null);
    }
     
    function transform( html, type ){
       // 1. Injecte le html dans le document pour pouvoir utiliser
       //    getElementById.
       var $div = document.createElement("div");
       $div.style.display = "none";
       $div.innerHTML = html;
       document.body.appendChild($div);
       var $refresh = document.getElementById("id-refresh-1");
       
       // Retire la <div> pour ne pas encombrer la page
       document.body.removeChild($div);
     
       // 2. Prépare une <table> et ses titres de colonnes
       var $table = document.createElement("table");
       $table.className = type;
       var $tbody = document.createElement("tbody");
       $table.appendChild($tbody);
     
       var $headRow = $table.createTHead().insertRow(-1);
       
       var insertTh = function( title ){
          var $th = document.createElement("th");
          $th.innerText = title;
          $headRow.appendChild($th);
       };
       
       insertTh("Heure");
       insertTh(type === "departures" ? "Départ dans" : "Arrivée dans");
       insertTh("Voie");
       insertTh(type === "departures" ? "Destination" : "Provenance");
       insertTh("N°");
       insertTh("Type");
     
       // 3. Parcourt toutes les entrées <li> contenues dans $refresh,
       //    en sautant les « spacers », garde uniquement le contenu texte
       //    et le transforme en ligne de tableau.
       var items = $refresh.getElementsByTagName("li");
       var odd = true;
       for (var i = 0, $li; $li = items[i++]; ) {
          if (/\bspacer\b/i.test($li.className)) continue;
     
          var $tr = parseEntry($li.innerText);
          if (odd) $tr.className = "odd";
          odd = !odd;
          $tbody.appendChild($tr);
       }
     
       $resultat.appendChild($table);
    }
     
    var rHeure    = /\d{2}h\d{2}/;
    var rDecompte = /(?:Départ|Arrivée) dans (\d{1,2}min)/;
    var rVoie     = /Voie ([A-Z])/;
    var rGare     = /(?:Destination|Provenance) ([A-Z ]+?) N°/;
    var rNumero   = /N°(\d+)/;
    var rType     = /\d+ ([\wé ]+)$/i;
     
    function parseEntry( entry ){
       entry = entry.replace(/\s+/g, " ");
     
       var heure = entry.match(rHeure)[0];
       var gare = entry.match(rGare)[1];
       var numero = entry.match(rNumero)[1];
       var type = entry.match(rType)[1];
     
       var decompteMatch = entry.match(rDecompte);
       var decompte = decompteMatch ? decompteMatch[1] : "";
     
       var voieMatch = entry.match(rVoie);
       var voie = voieMatch ? voieMatch[1] : "";
     
       var $tr = document.createElement("tr");
       $tr.insertCell(-1).innerText = heure;
       $tr.insertCell(-1).innerText = decompte;
       $tr.insertCell(-1).innerText = voie;
       $tr.insertCell(-1).innerText = gare;
       $tr.insertCell(-1).innerText = numero;
       $tr.insertCell(-1).innerText = type;
     
       return $tr;
    }
     
    </script>
    </body>
    </html>

    Il y a juste ce problème de gare indéterminée dont j'ai parlé hier
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    (⌐■_■)--︻╦╤─ - - -
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : (⌐■_■)--︻╦╤─ - - -

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Citation Envoyé par Watilin Voir le message
    J'ai fait divers essais avec l'URL de l'exemple et à chaque fois j'obtiens les mêmes trains :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    http://www.ter-sncf.mobi/station/detail?uic=87444000&name=Caen
    http://www.ter-sncf.mobi/station/detail?uic=87444000&name=Rennes
    http://www.ter-sncf.mobi/station/detail?uic=87444000&name=Paris
    http://www.ter-sncf.mobi/station/detail?uic=87444000&name=Moscou
    http://www.ter-sncf.mobi/station/detail?uic=87444000&name=la lune
    Au final, je ne sais pas à quelle gare ces résultats se rapportent ! Il doit y avoir une histoire de session quelque part.
    Citation Envoyé par Watilin Voir le message
    Il y a juste ce problème de gare indéterminée dont j'ai parlé hier
    Je dirais plutôt que la gare est déterminée par les paramètres Code ou uic.
    Par exemple je reprends Code=87441717 qui provient de :
    http://www.ter-sncf.com/Regions/alsa...Thermes-Centre

    Avec le uic changé, ça va.
    http://www.ter-sncf.mobi/station/detail?uic=87441717
    http://www.ter-sncf.mobi/station/detail?uic=87444000

  5. #25
    Invité
    Invité(e)
    Par défaut
    MyBad dji-why,
    Oui, je me suis mal exprimé avec le "têtu". Ce que voulais signifier, c'est que l'ouverture n'en est pas une.
    Parce qu'on ne sait pas vers quelle alternative se tourner pour vous répondre.
    Malgré tous les appels du pied pour savoir si vous aviez à accès à une technologie serveur, vous n'avez pas répondu clairement.
    Quand, vous nous dites être prêt à recevoir la réponse dans un autre langage, vous ne précisez pas lequel.
    Vous donner une réponse dans une technologie que vous ne pourrez mettre en œuvre, ce n'est pas vous rendre service.
    Vous donner une réponse dans un langage que vous ne comprenez pas, ce n'est pas non plus vous rendre service.
    Parce que le jour où on vous demandera de faire évoluer la solution, vous serez coincé.

    Finalement votre problème intéresse pas mal de monde, vous aurez plusieurs solutions.

Discussions similaires

  1. [RegEx] Regex pour parser une page web
    Par cyberlp dans le forum Langage
    Réponses: 8
    Dernier message: 11/12/2011, 05h12
  2. Erreur '91' - Parser une page web.
    Par geoffrey.brunet dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/06/2010, 11h59
  3. Réponses: 2
    Dernier message: 11/04/2009, 11h04
  4. parser une page web
    Par kiss_kool dans le forum Web
    Réponses: 0
    Dernier message: 26/10/2008, 12h55
  5. [RegEx] parser une page web
    Par fayza dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2008, 12h56

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