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 :

CURL en PHP et Encodage (fonctionne sur certaines URL)


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut CURL en PHP et Encodage (fonctionne sur certaines URL)
    Bonjour,

    Je m'adresse à vous en ultime espoir, après avoir lu tout ce que je pouvais sur les forums plus ou moins connus, et appliqué toutes les solutions possible. Et malheureusement, ne connaissant personne dans mon entourage pour me filer un coup de main, je compte sur vous

    Souhait :
    Je souhaite "curler" des URL, afin d'en récupérer le header + le code source, et en extraire des balises (title, metas...).
    J'ai trouvé que CURL était la meilleure solution, car il récupère aussi bien le header que le code source en 1 un hit.

    Mon code actuel. A pour effet :
    -> De bien fonctionner sur la page d'accueil (***é****e)
    -> Mais sur la page /test.html (en 404) : le title ressort de la forme ****è*****

    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
    28
    29
    30
    <?php
    
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    
    
    	$url = "https://www.xxx.fr/"; //On récupère l'URL
    
    	header('Content-Type: text/html; charset=utf-8');
    
    	//curl de l'URL
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_URL, $url);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    	curl_setopt($ch, CURLOPT_ENCODING ,"");
    
    	//xpath + header
    	$html = curl_exec($ch);
    	//$html = utf8_decode(curl_exec($ch));
    	$info = curl_getinfo($ch);
    	$dom = new DOMDocument('1.0', 'UTF-8');
    	@$dom->loadHTML($html);
    	$xpath = new DOMXPath($dom);
    	$title = trim($xpath->evaluate('string(/html/head/title)'));
    
    	echo $title;
    
    ?>
    J'ai alors essayé un autre code, en lisant les forums. A pour effet :

    -> De ne rien me renvoyer sur la page d'accueil ("")
    -> Mais sur la page /test.html (en 404) : le title est correct : "*****è*****"

    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
    28
    29
    30
    <?php
    
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    
    
    	$url = "https://www.xxxxxx.fr/test.html"; //On récupère l'URL
    
    	header('Content-Type: text/html; charset=utf-8');
    
    	//curl de l'URL
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_URL, $url);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    	curl_setopt($ch, CURLOPT_ENCODING ,"");
    
    	//xpath + header
    	//$html = curl_exec($ch);
    	$html = utf8_decode(curl_exec($ch));
    	$info = curl_getinfo($ch);
    	$dom = new DOMDocument('1.0', 'UTF-8');
    	$dom->loadHTML($html);
    	$xpath = new DOMXPath($dom);
    	$title = trim($xpath->evaluate('string(/html/head/title)'));
    
    	echo $title;
    
    ?>
    Un grand merci pour votre patience et lecture...

    Marie \m/

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    cURL retourne le même résultat dans les 2 cas, c'est la bibliothèque DOMDocument ou DOMXPath qui produit cette différence.
    mais pour cela je ne m'y connais pas donc je passe la main aux autres membre du forum.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Effectivement cURL n'y est pour rien, et libxml (la bibliothèque cachée derrière les classes DOMBidule) n'y est pas pour tant que ça.

    Renseigner les paramètres lors de l'instanciation de DOMDocument n'est utile que dans le cas où l'on souhaite construire un document de A à Z. Dans l'autre cas (lorsqu'on charge un document), ces informations sont écrasées par celles contenues dans le document.

    Il est donc inutile d'espérer influer sur l'encodage en écrivant $dom = new DOMDocument('1.0', 'utf-8');, autant écrire: $dom = new DOMDocument;.

    Lors du parsing d'un document html (déclenché par DOMDocument::loadHTML), l'encodage utf-8 du document peut être déterminé par différent biais notamment:
    • via la déclaration xml: <?xml encoding="utf-8"?>
    • via l'attribut charset: <meta charset="utf-8"/>
    • via le BOM(Byte Order Mark) \xef\xbb\xbf


    Dans le cas de page test.html, la seule information sur l'encodage disponible est <meta charset="utf-8"/>. Malheureusement celle-ci est placée trop tard dans le document et le parseur va l'ignorer (si elle avait été avant la balise title, il n'y aurait pas eu de problème). Le document aura alors un encodage par défaut: l'iso8859-1.

    La page d'index a exactement le même problème de position de la balise meta, et pourtant l'encodage est bien en utf-8. C'est parce que contrairement à l'autre, celle-ci débute par un BOM.

    Donc comment faire pour avoir toujours l'encodage utf-8 dans les deux cas?
    Par exemple, on peut enlever systématiquement le BOM et insérer une déclaration xml au début de la chaîne html. Ce qui donnerait:
    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
    20
    21
    header('Content-Type: text/html; charset=utf-8');
     
    $url = "https://www.chioupperdomain.com/";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_ENCODING ,"");
    $html = curl_exec($ch);
    $info = curl_getinfo($ch);
     
    $html = preg_replace('~\A(?:\xef\xbb\xbf)?~', '<?xml encoding="utf-8"?>', $html);
     
    $dom = new DOMDocument;
    $state = libxml_use_internal_errors(true);
    $dom->loadHTML($html);
    libxml_use_internal_errors($state);
     
    $xpath = new DOMXPath($dom);
    $title = trim($xpath->evaluate('string(/html/head/title)'));
     
    echo $title;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Chargé de référencement
    Inscrit en
    Juin 2018
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Juin 2018
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    Un grand merci, je ne savais pas qu'il y avait un ordre pour la meta lang, afin que tout le reste soit prix en compte.
    Ton code fonctionne, forcément, cela va vraiment beaucoup m'aider.

    Marie

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En fait, c'est le parseur de libxml qui est sensible à cet ordre (il semble logique de définir l'encodage avant tout nœud texte), mais ça ne gène pas les navigateurs qui sont beaucoup plus tolérants.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Redirection https sur certaines url
    Par palestrina dans le forum Apache
    Réponses: 0
    Dernier message: 05/04/2018, 15h35
  2. Réponses: 1
    Dernier message: 21/02/2017, 16h54
  3. [XL-2003] Macro fonctionne sur certains PC et pas sur d'autres
    Par maxtheb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/09/2009, 12h54
  4. Réponses: 2
    Dernier message: 28/03/2007, 18h50

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