Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
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 11/01/2012, 15h27   #1
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Par défaut Problème pour récupération du contenu d'une class

Bonjour,

j'ai le code suivant qui doit me permettre de parser, chacune des 10 pages de mon site, en extrayant le contenu des div portant la class "ma_class".

or il n'affiche rien...

merci pour votre aide !!


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
 
for ($page=0; $page<10; $page++) {
 
	$url="http://monsite.com/?page=".$page;
// Ce lien est correct
 
	$doc = new DOMDocument();
	$doc->loadHTMLFile($url);
 
	$xpath = new DomXpath($doc);
	$search = $xpath->query('//div[@class="ma_class"]');
 
			for ($i=0; $i<$search->length; $i++) {
 
			$titre = $xpath->query('//div[@class="ma_class"]')->item($i)->nodeValue;
			echo $titre .";";
	}
 
}
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 18h21   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
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 991
Points : 5 031
Points : 5 031
Essaie ça pour voir:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
for ($page=0; $page<10; $page++) {
	$url = "http://monsite.com/?page={$page}";
 
	$doc = new DOMDocument;
	$doc->loadHTMLFile($url);
	$xpath = new DOMXPath($doc);
 
	$nodes = $xpath->query('//div[@class="ma_class"]');
	foreach ($nodes as $node) {
		echo $node->nodeValue;
	}
}
__________________
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 12/01/2012, 00h31   #3
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Curieux, toujours rien d'affiché.

Pourtant la variable $url est correcte et "<div class="ma_class"> existe bien dans le document HTML.
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 09h10   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
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 991
Points : 5 031
Points : 5 031
Bon allez c'est parti pour le débug bien cradingue

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ini_set('display_errors', 1);
error_reporting(-1);
 
header('Content-Type: text/plain');
 
for ($page=0; $page<10; $page++) {
	$url = "http://monsite.com/?page={$page}";
        var_dump($url);
 
	$doc = new DOMDocument;
	$doc->loadHTMLFile($url);
	var_dump($doc->saveHTML());
 
        $xpath = new DOMXPath($doc);
 
	$nodes = $xpath->query('//div[@class="ma_class"]');
        var_dump($nodes->length);
	foreach ($nodes as $node) {
                var_dump($node);
		echo $node->nodeValue;
	}
        var_dump('------- NEXT ---------');
}
__________________
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 12/01/2012, 09h15   #5
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Code :
1
2
3
4
5
6
7
string(44) 
URL
 
Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: Unexpected end tag : div in URL, line: 57 in /home/monURL/index.php on line 44
 
Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: error parsing attribute name in URL, line: 111 in /home/monURL/index.php on line 44
bool(false) int(0) string(22) "------- NEXT ---------"
voilà le message d'erreur

il s'agit de ces 2 lignes répétées plein de fois
(bien sûr à la place de URL et monURL ce sont de vraies URL, hein
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h30   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
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 991
Points : 5 031
Points : 5 031
C'est parce que le flux HTML renvoyé par cette URL est invalide que DOMDocument refuse de le charger.

Tu peux tenter et
Code :
$doc->strictErrorChecking = false;
__________________
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 13/01/2012, 10h48   #7
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Ici ?

Code :
1
2
3
4
5
$doc = new DOMDocument;
	$doc->loadHTMLFile($url);
	$doc->recover = true;
	$doc->strictErrorChecking = false;
	var_dump($doc->saveHTML());
Cela dit, il m'est déjà arrivé de parser une page HTML invalide, ça affichait bien des messages d'erreur mais le parsing fonctionnait quand même...
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h52   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
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 991
Points : 5 031
Points : 5 031
Non juste après avoir instancié DOMDocument.
__________________
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 13/01/2012, 10h55   #9
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Malheureusement les messages persistent :/
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h09   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
libxml_use_internal_errors ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h26   #11
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
les erreurs disparaissent, mais je ne comprends toujours pas pourquoi le parsing ne marche pas...
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h36   #12
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
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 991
Points : 5 031
Points : 5 031
Corrige tes page pour qu'elles passent le validateur W3C. C'est tout ce qu'il te reste à faire.
__________________
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 13/01/2012, 11h41   #13
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Le problème c'est que ne ce sont pas mes pages...

Bon je vais creuser de mon côté, merci pour ton aide !
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 12h05   #14
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Salut,
peux-tu retenter le code de Benjamin mais en faisant plutôt :

Code :
1
2
3
$doc = new DOMDocument;
$doc->loadHTMLFile($url);
var_dump($doc);
si tu obtiens false c'est que le problème vient définitivement du parsing de la page et non pas de l'expression XPath qui ne retournerait rien.

Sinon pour info, la 2e requête de la 2e boucle dans ton code est inutile car l'expression //div[@class="ma_class"] est censée te retourner déjà tous les noeuds il me semble.

loadHTMLFile résout pas mal de problèmes lors de la construction de l'arbre DOM à partir de documents mal formés, ce que je veux dire par là c'est que les erreurs ne sont pas forcément critiques.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 12h26   #15
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Sur le :

Code :
1
2
3
	$doc = new DOMDocument;
	$doc->loadHTMLFile($url);
	var_dump($doc);
j'obtiens :

Code :
object(DOMDocument)#1 (0) { }
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 12h31   #16
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
On dirait donc que le document est finalement construit. Si tu fais ensuite :

Code :
var_dump($doc->getElementsByTagName('div')->length);
est-ce que tu as bien un chiffre différent de 0 ? qui devrait correspondre au nombre de div total dans ta page.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 12h37   #17
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
Oui il affiche 19 div

cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 12h41   #18
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Tu peux aussi vérifier avec :
Code :
echo htmlentities($doc->saveHTML());
que cela génère bien le HTML.
Ce qui est bizarre c'est que ça retournait false quand tu as fait le premier test avec le code de Benjamin. Je ne vois aucune raison pour que var_dump($doc) retourne bien l'identifiant du DOMDocument mais que $doc->saveHTML() ne fonctionne pas.

Si echo htmlentities($doc->saveHTML()); fonctionne tu pourrais vérifier de nouveau que tu as bien des <div class="ma_class"> dedans. Au final, c'est peut-être l'expression XPath qui ne retourne rien.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 12h44   #19
Invité régulier
 
Inscription : janvier 2009
Messages : 60
Détails du profil
Informations forums :
Inscription : janvier 2009
Messages : 60
Points : 9
Points : 9
htmlentities ne retourne rien !
cyberlp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 13h00   #20
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Dernière tentative :/ est-ce que tu n'aurais pas une autre erreur que l'une des 2 que tu as citées :

Citation:
Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: Unexpected end tag : div in URL, line: 57 in /home/monURL/index.php on line 44

Warning: DOMDocument::loadHTMLFile() [function.DOMDocument-loadHTMLFile]: error parsing attribute name in URL, line: 111 in /home/monURL/index.php on line 44
car aucune des 2 ne semble critique, en tout cas sous ma version de PHP, ceci fonctionne par exemple :

Code :
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
<html>
<head>
<title></title>
</head>
<body>
    <p>
    </div>
<gagu
    <div class="ma_class">(1)<div class="ma_class">(1.1)</div></div>
<div class="ma_class">(2)<div class="ma_class">(2.1)</div></div>
<div class="ma_class">(3)</div>
</body>
</html>
<?php
$doc = DOMDocument::loadHTMLFile("index.php");
var_dump($doc);
echo htmlentities($doc->saveHTML());
 
var_dump($doc->getElementsByTagName('div')->length);
 
$xpath = new DomXpath($doc);
$search = $xpath->query('//div[@class="ma_class"]');
 
for ($i = 0; $i < $search->length; $i++) {
    $class = $search->item($i)->nodeValue;
    echo "<br>div class : ".$class;
}
Sinon peux-tu poster le lien ou le code HTML de l'une des pages qui pose problème (ou par MP si tu préfères) ?
__________________
Vive les roues en pierre
Djakisback 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 22h56.


 
 
 
 
Partenaires

Hébergement Web