par
titerm » 23 mai 2007, 02:27
Le motif
//qq chose/../*
est bien synonyme de
//qq chose/parent::*
?
Oui, mais je trouve .. plus lisible que parent::
Cette ligne compte bien le nombre de ligne
(parent de td) ?
Code : Tout sélectionner
$qnumber = 'count(//td[contains(text(),"'.$needle.'")]/../*)';
Non, elle compte le nombre de colonne. On recherche tous les td qui contienne un certain texte, le noeuds courant est donc l'intérieur du td, on remonte d'un cran et on selectionne tous les fils soit tous les td de la ligne qui contenait $needle.
Comment traiter le cas ou un tableau est inclus dans une ligne ?
Aprés avoir trouvé la chaine "Chiffre d'affaires", je suis confronté à un tableau inséré dans des colonnes fusionnées !
En faisant un peu différment je pense, j'avais proposé ca pour donnée une idée. Plutot que de compter les noeuds, il faut peut etre etre plus carré, chercher tous les tr du tableau qui t'interresse, puis parcourrir tous les td de chaque tr. Dans chaque td, vérifier si y a un tableau et faire la meme manip (récursion)
Attention, ce bout code est a titre d'exemple, il ne gère pas le cas ou il y a plusieurs tableau dans un td par exemple, je t'indique la route, a toi ensuite de faire le chemin...
<?php
$doc = new DOMDocument();
@$doc->loadHTMLFile("http://www.boursorama.com/profil/resume_societe.phtml?symbole=1rPARR");
$xpath = new DOMXPath($doc);
// On encode la chaine a chercher en utf8
$needle = utf8_encode("Chiffre d'affaires");
// On recherche dans tous les td une case de tableau qui contient la chaine rechercher, puis on recupere tous les tr du tableau qui match
$query= '//td[contains(text(),"'.$needle.'")]/../../*';
$trList = $xpath->query($query,$doc->documentElement);
function getData($nodes) {
$line=0;
foreach ($nodes as $tr) {
$row=0;
$tds = $tr->getElementsByTagName('td');
foreach($tds as $td) {
// Check si y a des tables en noeuds enfants
$fiston = $td->getElementsByTagName('table') ;
// Si oui, on recurse
if($fiston->length) {
// J'ajoute un index bidon 'récursion' pour pouvoir le repérer plus facilement dans le dump
// @todel une fois compris
$data[$line][$row++]['recursion'] = getData($fiston);
}
// Si non, on recupe jsute la valeur du noeud
else {
$data[$line][$row++] = $td->nodeValue;
}
}
$line++;
}
return $data;
}
$data = getData($trList);
var_export($data);
[quote="apatride"]
Le motif
[php]//qq chose/../*[/php] est bien synonyme de [php]//qq chose/parent::*[/php] ?
[/quote]
Oui, mais je trouve .. plus lisible que parent::
[quote="apatride"]
Cette ligne compte bien le nombre de ligne [size=75](parent de td)[/size] ?
[code]$qnumber = 'count(//td[contains(text(),"'.$needle.'")]/../*)';[/code]
[/quote]
Non, elle compte le nombre de colonne. On recherche tous les td qui contienne un certain texte, le noeuds courant est donc l'intérieur du td, on remonte d'un cran et on selectionne tous les fils soit tous les td de la ligne qui contenait $needle.
[quote="apatride"]
Comment traiter le cas ou un tableau est inclus dans une ligne ?
Aprés avoir trouvé la chaine "Chiffre d'affaires", je suis confronté à un tableau inséré dans des colonnes fusionnées !
[/quote]
En faisant un peu différment je pense, j'avais proposé ca pour donnée une idée. Plutot que de compter les noeuds, il faut peut etre etre plus carré, chercher tous les tr du tableau qui t'interresse, puis parcourrir tous les td de chaque tr. Dans chaque td, vérifier si y a un tableau et faire la meme manip (récursion)
Attention, ce bout code est a titre d'exemple, il ne gère pas le cas ou il y a plusieurs tableau dans un td par exemple, je t'indique la route, a toi ensuite de faire le chemin...
[php]
<?php
$doc = new DOMDocument();
@$doc->loadHTMLFile("http://www.boursorama.com/profil/resume_societe.phtml?symbole=1rPARR");
$xpath = new DOMXPath($doc);
// On encode la chaine a chercher en utf8
$needle = utf8_encode("Chiffre d'affaires");
// On recherche dans tous les td une case de tableau qui contient la chaine rechercher, puis on recupere tous les tr du tableau qui match
$query= '//td[contains(text(),"'.$needle.'")]/../../*';
$trList = $xpath->query($query,$doc->documentElement);
function getData($nodes) {
$line=0;
foreach ($nodes as $tr) {
$row=0;
$tds = $tr->getElementsByTagName('td');
foreach($tds as $td) {
// Check si y a des tables en noeuds enfants
$fiston = $td->getElementsByTagName('table') ;
// Si oui, on recurse
if($fiston->length) {
// J'ajoute un index bidon 'récursion' pour pouvoir le repérer plus facilement dans le dump
// @todel une fois compris
$data[$line][$row++]['recursion'] = getData($fiston);
}
// Si non, on recupe jsute la valeur du noeud
else {
$data[$line][$row++] = $td->nodeValue;
}
}
$line++;
}
return $data;
}
$data = getData($trList);
var_export($data);[/php]