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 25/05/2011, 22h32   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Par défaut Requêtes Xpath et balises dans un DOMdocument HTML

Bonsoir,

Pour parser une page HTML, j'utilise DOMDocument d'après les bons conseils de stealth35 ;-) :

Code :
1
2
3
  $doc = new DOMDocument('1.0','UTF-8');
  $doc->loadHTMLFile($url);
  $DOMxpath = new DOMXPath($doc);
Ensuite j'applique à ce document une requete Xpath afin de récupérer le contenu d'une balise <p> ayant la classe "xxx" dont voici le code dans la page XTML

Code :
<p class="xxx">du texte<br/>encore du texte<br/><a title="bla bla" class="sfets" href="#">et enfin un autre texte</a></p>
Voici ma requete Xpath

Code :
1
2
3
 
$xpath= "//tbody[@class='man']/tr/p[@class='xxx']";
$var= $DOMxpath->query($xpath)
Ensuite je fais un foreach pour faire une action sur chaque <p> de cette classe trouvé

Jusque la tout va bien sauf que si je veux récupérer le contenu de ma balise <p> sans le lien <a> qu'il contient, je ne peux pas car dans ma boucle, $var->item($i)->nodeValue me retourne tout ce qui n'est pas dans des balises soit ici :

du texteencore du texteet enfin un autre texte

Ma question est la suivante : Est-il possible de récupérer avec le résultat d'une requete Xpath dans un Domdocument, le contenu d'une balise avec les balises qu'elle contient pour ensuite éventuellement le traiter avec des fonctions PHP afin d'en afficher ce que bon me semble ?

Si non quelle serait la solution pour retirer ce qui ne me convient pas dans le résultat de ma requête ? dois-je changer la requête ?

J'espère avoir été assez clair :-/

Merci d'avance !
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 23h19   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
oui c'est possible t'as un exemple de innHTML dans les commentaires :
http://www.php.net/manual/fr/book.dom.php#89718
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/05/2011, 00h11   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Ça fonctionne, c'est génial !

Merci infiniment de ton aide !
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 13h20   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Salut à tous !

J'ouvre à nouveau le sujet car je me trouve confronté à un autre problème que j'aie vraiment du mal à résoudre...

Dans le texte que je reçois avec la fonction énumérée ci dessus (DOMinnerHTML) voici mon code final

Code :
$var = DOMinnerHTML($dates->item($i))
"$dates->item($i)" me retourne le noeud ou ce trouve :

Code :
<p class="xxx">du texte<br/>encore du texte<br/><a title="bla bla" class="sfets" href="#">et enfin un autre texte</a></p>
Mais maintenant j'aimerais retirer la balise "a" de ce texte en gardant les balises <br> (je sais je suis fatiguant...) au final je voudrais me retrouver avec :

Code :
<p class="xxx">du texte<br/>encore du texte<br/>et enfin un autre texte</p>
Quel serait le moyen le plus optimisé pour réaliser cela ?

J'ai essayé d'utiliser http://simplehtmldom.sourceforge.net/ mais je n'y suis pas parvenu et je peux surement le faire directement avec DOMDocument ?

Merci
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 13h29   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
avant de faire ton DOMInnerHTML, sois tu fait un xpath sous un getElementsByTagName sur les <a> et tu fait un removeChild
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h15   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Je ne comprends pas très bien ce que tu veux dire...

Si je recherche tous les a de mon document et que je fais un removeChild ça ne va pas supprimer la balise ET son contenu ? moi je voudrais conserver le contenu de la balise a mais je voulais juste qu'il ne soit pas clickable.

Je ne suis pas très à l'aise avec DOMDocument :-/
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h24   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par vgross Voir le message
Je ne comprends pas très bien ce que tu veux dire...

Si je recherche tous les a de mon document et que je fais un removeChild ça ne va pas supprimer la balise ET son contenu ? moi je voudrais conserver le contenu de la balise a mais je voulais juste qu'il ne soit pas clickable.

Je ne suis pas très à l'aise avec DOMDocument :-/
Faudrait récupérer le texte les l’insérer après, mais a la base c'est pour faire quoi ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h32   #8
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Je travail actuellement sur un portail comparatif de prix.

Je récupère ces balises sur des sites via DOMDocument et ensuite je cherche à les traiter pour les afficher comme je le voudrais sur mon portail.

Pour l'exemple, je récupère une balise p dans laquelle se trouve un lien (qui pointe sur une URL interne du site ou je l'ai récupéré), je voudrais donc afficher cette information sur mon site en retirant le lien, mais uniquement le lien (car d'un je ne veux pas de lien sur cette information sur mon site, et de deux le lien ne peux marcher si je le récupère car il pointe sur une adresse interne au site que je viens de scanner).

Au final, je cherche être à l'aise pour manipuler le contenu que je récupère via DOMDocument pour ensuite le remettre en forme et l'afficher correctement sur mon site. ça me permettrait de m'adapter à chaque site selon les cas de figures (qui sont différents sur chaque sites)
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h36   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
c'est pas terrible de faire ça, il te faut aussi l’autorisation des sites pour pouvoir récupérer leurs contenus, mais aussi les modifiés, vérifie aussi si les sites de proposent pas une API pour les applications tiers
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h44   #10
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Non il s'agit d'un très petit marché et les sites ne proposent pas d'API pour faire ça, cela dit il y a un avocat d'affaire dans ce projet qui m'a confirmé que j'avais le droit de faire ça dans la mesure ou je ne stock jamais la donnée.

Vu qu'il y a uniquement une vingtaine de site à scanner et que ce nombre ne grandira presque plus, j'ai opté pour cette solution car je n'ai pas trouvé un meilleur moyen...

Penses-tu que je devrais procéder autrement ?
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 14h51   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
il faut que tu fasses comme j'ai dis plus haut
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 15h02   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Comme tu as dit plus haut me fait écrire beaucoup de lignes dans ma boucle. Je viens de trouver une solution alternative avec strip_tags() c'est de retirer toutes les balises en spécifiant les balises que je voulais garder (car je les connais toujours d'avance) du coup mon code deviens le suivant :

Code :
$var = strip_tags(DOMinnerHTML($dates->item($i)),'<br>');
aurais-je un avantage à utiliser ta solution plutôt que la mienne ?

Merci de ton aide en tout cas !
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 15h30   #13
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
Citation:
Envoyé par vgross Voir le message
Comme tu as dit plus haut me fait écrire beaucoup de lignes dans ma boucle. Je viens de trouver une solution alternative avec strip_tags() c'est de retirer toutes les balises en spécifiant les balises que je voulais garder (car je les connais toujours d'avance) du coup mon code deviens le suivant :

Code :
$var = strip_tags(DOMinnerHTML($dates->item($i)),'<br>');
aurais-je un avantage à utiliser ta solution plutôt que la mienne ?

Merci de ton aide en tout cas !
la tu ne gardes que les sauts de ligne donc autant utiliser direct le textContent
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 09h19   #14
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 14
Points : 14
Je souhaitais justement les garder ces sauts de lignes et la propriété textContent du DOMNode ne me les conservaient pas c'est uniquement pour ça que je cherchais une solution alternative...
vgross est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h35.


 
 
 
 
Partenaires

Hébergement Web