Bonjour à tous ,

Voilà, je m'en remet à vous car je bloque depuis plusieurs jours sur une problématique au niveau d'un scraper de contenus distants. Je développe actuellement un réseau social, et je souhaite mettre en place un outil de partage type Facebook.

Dès qu'une adresse est entrée dans le champ de partage, une fonction JS exécute une requête AJAX vers un scraper situé dans un fichier PHP. Le scraper fonctionne de la manière suivante :

- On récupère le contenu de l'url cible via cURL
- On parse le DOM du contenu récupéré via PHP, xPath
- Je récupère les node qui m'intéressent (title, meta description, link rel image

Mon site utilise un encodage ISO-8859-1 et je n'arrive pas à trouver le bon comportement pour faire une prévisualisation correcte des données récupérées.

L'idée est d'afficher comme sur Facebook un petit bloc résumant la page distante. Mais selon le site cible, j'ai des problèmes liés aux accents.

Selon le content-type distant (UTF-8, ISO-8859-1, parfois pas déclaré), le traitement des chaînes récupérées n'est en effet pas le même (tantôt utf8_decode, tantôt convertir les entités HTML...)

J'aimerai savoir si via cURL, il est possible de récupérer le content-type distant ? J'ai tenté
Code : Sélectionner tout - Visualiser dans une fenêtre à part
echo curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
mais il me retourne UTF-8 quand il s'agit d'un charset ISO-8859-1...

J'ai bien tenté de localiser via xPath la balise content-type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
/html/head/meta[@http-equiv='content-type']/@content
mais vous devez savoir qu'un chemin xPath est sensible à la case... Donc il suffit que le site distant présente une déclaration Content-Type, ou CONTENT-TYPE pour que ça ne trouve pas la valeur...

Voici les options déclarées pour cURL :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 25);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  curl_setopt($ch, CURLOPT_HEADER, 0);
Avez-vous des pistes sur le fonctionnement que pourrait avoir le scraper de Facebook pour ne pas être confronté à des problématiques liés à l'encodage ? Parfois les sites distants sont en UTF-8 contiennent des entités HTML, parfois non. J'ai pensé éventuellement créer une fonction qui vérifierait à l'aide de preg_replace si oui ou non j'ai des entités (je n'ai pas trouvé une manière de contraindre html_entity_decode) et je n'ai pas forcement besoin de toujours l'executer...

Je ne sais pas si je suis bien clair dans ma demande... N'hésitez pas à me demander des précisions :-)

Merci