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érer info sur site distant avec xpath


Sujet :

Langage PHP

  1. #1
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut Récupérer info sur site distant avec xpath
    Bonjour à tous,
    Je souhaite récupérer une informations sur une page intranet de notre entreprise. Pour ce faire, sur les conseils de Sabotage j'essaye d'utiliser xpath et le code ci-dessous en substitution de file_get_contents.
    Voici donc mon code
    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
     
    <html>
    <body>
    <? php
    	$doc = new DOMDocument();
    	$doc->loadHTMLFile('http://collaboratif/sites/Intranet/SitePages/intranet_avotreservice.aspx');
    	$xpath = new DOMXpath($doc);
    	$CodePos1Bis = "C1".$CodePos1;
    	$elements = $xpath->query('//span[@item="' . $CodePos1Bis . '"]');
    	$abc= $elements->item(0)->nodeValue;
    	$PrixCurPos1 = explode(" ",$abc);
    ?>
    <span id="PrixTurboCP_1"><?php echo $PrixCurPos1[0]; ?></span>
    </body>
    </html>
    Ce code fonctionne, mais j'ai cependant un léger soucis :
    Voici le code de la page "cible" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span source="lightstreamer" table="Shm_FullArea_ctl00_PushTable" item="C1DE000CW40VT7" field="bid">3,13 EUR</span>
    J'ai besoin de récupérer la valeur 3,13 pour effectuer des calculs par la suite.
    Je sais convertir 3,13 en 3.13 pour que le calcul soit possible, aucun soucis de ce côté là.
    Je pensais aussi "tronquer" la variable pour ne récupérer que les chiffres en utilisant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	$abc= $elements->item(0)->nodeValue;
    	$PrixCurPos1 = explode(" ",$abc);
    Malheureusement ça ne fonctionne pas parfaitement.En effet, je vois afficher 3,13Â EUR
    Si je fais un essais en mettant juste echo $elements, le code m'affiche toujours la même chose : 3,13Â EUR
    Savez vous pourquoi ? et comment remédier à ce petit soucis ?

    Merci d'avance

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 010
    Par défaut
    Ce qui sépare le "3,13" de "EUR" n'est pas un simple espace (U+0020 SPACE) mais un espace insécable (U+00A0 NO-BREAK SPACE). Ce caractère quand il est encodé en UTF-8 est composé de deux octets: C2 et A0.

    Comme visiblement tu n'as pas précisé dans ta page html l'encodage avec:<meta charset="UTF-8"/>, ton navigateur affiche les chaînes de caractères octet par octet en se rapportant à la table unicode. Donc il affiche C2 en le prenant pour le caractère  (U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX) et A0 comme l'espace insécable (U+00A0 NO-BREAK SPACE).

    Il suffit de placer la balise meta dans ton code html pour solutionner le problème d'affichage, ou de remplacer l'espace insécable par un espace "normal".

    Pour extraire la valeur, plusieurs solutions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $val = preg_replace('~[^0-9,.]+~', '', $str); // qui retire tout ce qui n'est pas un chiffre, un point, une virgule en lisant la chaîne octet par octet
    $val = preg_replace('~\x{00A0}EUR~u', '', $str); // cette fois la chaîne est considérée comme encodée en UTF8, et la partie à enlever est explicitement décrite
    $val = preg_split('~\x{00A0}~u', $str)[0]; // on split sur l'espace insécable
    $val = preg_split('~\s+~u', $str)[0]; // on split sur n'importe quel caractère blanc de la table unicode (plutôt tout terrain)
    // ou sans regex:
    $val = explode(chr(194), $str)[0]; // on éclate la chaîne sur l'octet C2 (194 en décimal)
    À propos du début de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php // il n'y a pas d'espace avant "php"
        $doc = new DOMDocument; //<-- les parenthèses sont inutiles
        $doc->loadHTMLFile('http://collaboratif/sites/Intranet/SitePages/intranet_avotreservice.aspx');
        $xpath = new DOMXPath($doc); // attention à la casse: DOMXPath
        $CodePos1Bis = "C1".$CodePos1;
        $elements = $xpath->query('(//span[@item="' . $CodePos1Bis . '"])[1]'); // permet d'arrêter la recherche dés qu'une occurrence est trouvée
        if ($elements->length) { // on vérifie d'abord que la recherche a été fructueuse en regardant la taille de la liste de nœuds
            $abc= $elements->item(0)->nodeValue; // sans quoi item(0) peut ne pas exister
            //...
        }

  3. #3
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    Merci pour ta réponse. Je regarde à ça dès que possible

  4. #4
    Membre très actif
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Par défaut
    merci beaucoup pour ton aide, ça fonctionne très bien !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer infos sur page distante
    Par bricechris dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/05/2013, 22h43
  2. [Joomla!] Erreur à l'installation de template sur site distant
    Par Siguillaume dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/09/2008, 17h52
  3. Récupérer partie sur site
    Par punisher999 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 01/11/2007, 09h51
  4. Tester et récupérer des infos sur fichier distant
    Par cybertj dans le forum Langage
    Réponses: 2
    Dernier message: 17/05/2006, 10h18
  5. Connexion sur site distant avec un client écrit en PERL ??
    Par Cygnus Saint dans le forum Modules
    Réponses: 2
    Dernier message: 07/03/2006, 11h45

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