Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2011, 17h12   #1
Invité de passage
 
Inscription : mars 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
Par défaut Récupération de contenu sur un site externe

Bonjour à tous,

J'essaie de récupérer du contenu qui se trouve sur un site externe.

J'utilise une fonction curl pour récupérer le contenu entre 2 balises précises.

Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
 
$curl = curl_init("http://www.exemple.com/page.html");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_HEADER, false);
$page = curl_exec($curl);
$error = curl_errno($curl);
curl_close($curl);
preg_match('`<div id="text">(.*?)</div>`Uis', $page, $match);
echo $match[0];
Le problème est que cette fonction me renvoie tout ce qui se trouve entre les balises dès la première qu'il trouve.
Or, comment faire pour récupérer la deuxième balise qu'il rencontrerait ?

Ex :
J'ai ces balises :
Code :
1
2
3
4
 
<div id="text">Mon texte 1</div>
<div id="text">Mon texte 2</div>
<div id="text">Mon texte 3</div>
J'aimerai pouvoir récupérer "Mon texte 2".

Comment faire ?

Merci !
vince62fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h16   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
pour parser du HTML c'est avec DOMDocument
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h25   #3
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 586
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 586
Points : 859
Points : 859
Citation:
Envoyé par stealth35 Voir le message
pour parser du HTML c'est avec DOMDocument
sans vouloir contredire stealth35 sur ca méthode, juste pour info la fonction c'est preg_match_all() et tu récupères un tableau...
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h31   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
sans vouloir présumer de ce que va dire Stealth35, les regexp pour trouver des éléments dans des flux XML c'est mal.

Déjà, avec des id multiples c'est mal barré

Pour trouver tes éléments tu peux utiliser ce xpath:
De cette façon:
Code :
1
2
3
4
5
6
7
8
9
10
 
$dom = new DOMDocument;
$dom->loadXML($content);
 
$xpath = new DOMXPath($dom);
$query = "div[@id='text']";
$nodes = $xpath->query($query);
foreach ($nodes as $node) {
  echo "Value: " . $node->nodeValue;
}
Enjoy
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 17h36   #5
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 586
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 586
Points : 859
Points : 859
mais honnêtement y a quoi comme code derrière les méthodes la ?
y aurait pas une regexp ou deux qui trainerait par ci ou par la ?
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 15/03/2011, 17h38   #6
Invité de passage
 
Inscription : mars 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
Citation:
Envoyé par Benjamin Delespierre Voir le message
sans vouloir présumer de ce que va dire Stealth35, les regexp pour trouver des éléments dans des flux XML c'est mal.

Déjà, avec des id multiples c'est mal barré

Pour trouver tes éléments tu peux utiliser ce xpath:
De cette façon:
Code :
1
2
3
4
5
6
7
8
9
10
 
$dom = new DOMDocument;
$dom->loadXML($content);
 
$xpath = new DOMXPath($dom);
$query = "div[@id='text']";
$nodes = $xpath->query($query);
foreach ($nodes as $node) {
  echo "Value: " . $node->nodeValue;
}
Enjoy
C'est pour parser du xml ça aussi non ?
Pour du html, ça fonctionne quand même ?
vince62fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h42   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
oui c'est plus loadHTMLFile qu'il faut faire (donc pas besoin de cURL non plus)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h50   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Citation:
mais honnêtement y a quoi comme code derrière les méthodes la ?
Les regexp sont utiles quand tu veux trouver des entités dans du plain-text. Dans le cadre d'un arbre XML, le DOM te fournit une structure d'accès au donnés plus optimale et plus puissante. Je n'ai jamais décompilé l'extension PHP qui y correspond donc je ne peux pas l'affirmer mais logiquement, on ne doit pas avoir de regexp là dedans.
De plus, pour avoir implémenté les deux solutions pour faire des moteurs de templates, l'un avec regexp et l'autre avec DOM, le DOM va à la vitesse de la lumière comparé aux regexp.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h58   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
derrière c'est comme du SAX
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 18h12   #10
Invité de passage
 
Inscription : mars 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 14
Points : 0
Points : 0
Ca donne un peu près ça ?

Code :
1
2
3
4
5
6
7
8
9
10
11
 
$content = "http://www.mapage.com/test.html";
$dom = new DOMDocument;
$dom->loadHTMLFile($content);
 
$xpath = new DOMXPath($dom);
$query = "div[@id='text']";
$nodes = $xpath->query($query);
foreach ($nodes as $node) {
  echo "Value: " . $node->nodeValue;
}
J'ai une petite () erreur :
Citation:
Warning: DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: htmlParseEntityRef: expecting ';' in http://www.mapage.com/test.html, line: 220 in /web/www/fonction.php on line 28
vince62fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h26   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
oui la page ne doit pas etre valide, mais pas de soucis comme c'est du en HTML, fais un libxml_use_internal_errors avant loadHTMLFile et libxml_clear_errors après
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h49.


 
 
 
 
Partenaires

Hébergement Web