[RESOLU] [Résolu] Parser un tableau html

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] [Résolu] Parser un tableau html

Re: Parser un tableau html

par asf21 » 16 oct. 2012, 14:56

A tout hazard, on peut poster le résultat fonctionnel de notre travail, si ca peut intéresser quelqu'un, sait-on jamais?

Re: Parser un tableau html

par asf21 » 15 oct. 2012, 00:05

Ton strtok m'a interpellé, j'ai approfondi le sujet en relisant la doc officielle pour tomber sur preg_split, j'ai recodé ce truc:
$titre_recherche = $_POST['liste'];
$titre_recherche_url = urlencode($titre_recherche);

$url = "...url...".$titre_recherche;
$file = @fopen($url, 'r');
$contents = file_get_contents($url);

$explode = explode("(cliquer pour infos)</span></th>",$contents);
$explode1 = $explode[1];
$explode2 = explode("</tr></table><div class=\"navbar\"",$explode1);
$table = $explode2[0];

$tr = preg_split("/<\/?"."tr".">/",$table);	

foreach($tr as $element)
{	
	$td = preg_split("/<\/?"."td".">/",$element);
    foreach($td as $element2)
	{
		echo '<span>'.$element2.'</span><br />';
 	}
}

fclose($file);
Et là, victory! La liste apparait bel et bien!
Maintenant, je peux enfin travailler sur du propre! Ah, les regexp!
En attendant, merci beaucoup pour ta patience et tes astuces qui ont l'air d'aider pas mal de monde! (et oui, j'aime bien connaitre les gens avec qui je converse! ;) )
On met où "Résolu" pour ce sujet?
Cordialement.

EDIT:
Je viens d'essayer avec DOM et getElementsByClassName, pouah l'horreur! plein de retour d'erreurs!
Vu que preg_split peut devenir gourmand en ressources serveur, j'ai voulu tenter du DOM, bah c'est pas si evident que cela!

Re: Parser un tableau html

par sirakawa » 14 oct. 2012, 23:50

On n'a absolument pas besoin d'excel. Mais une fois le tableau rendu au format CSV, il est facile à intégrer dans PHP... On a juste besoin de OpenOffice Calc.
C'est vrai de tous les tableaux extérieurs à PHP. Ou alors il faudrait aller voir du côté du code de Firefox ou autre Luakit... comment ils gèrent les tableaux. Parce que ce que tu veux faire c'est un analyseur syntaxique et ça se fait avec un automate à états:
du genre
état 1: tant que je trouve autre chose que < j'avance: passsage à l'état 2
état 2: tant que je trouve des espaces, j'avance; si je trouve T ou t je passe à l'état .3
état 3 : si je trouve ABLE ou une des variantes MAj/min je passe en 4
état 4 : il peut y avoir Border ou class....
etc etc
Peut-être pourrait-on se borner à chercher:
<tr ou <TR ou < tr (on a le droit de mettre un espace là?)
on trouve <tr, et tu cherches le <td; quand tu l'as trouvé tu cherches > et tout ce qui se trouve avant le < suivant est une donnée. (ce <est celui de </td. donc on peut de nouveau cherche un < (qui sera celui de <td
Comme on sait qu'il y a 3 colonnes, c'est plus facile. après la troisième on cherche un <tr.... etc sans quoi on peut tester le contenu des < pour repérer les changements de ligne:il suffit de tester les débuts de balises, car on présume le tableau juste.

Re: Parser un tableau html

par asf21 » 14 oct. 2012, 23:04

Merci de ton aide, sirakawa mais je ne veux absolument pas utiliser quoique ce soit de chez micoseoft, je code en php.
C'est moche et inutilement lourd tout ce qui tourne autour de crotruc, même si avant je codais en asp /.net.
Excel, c'est juste pour rendre plus "compatible" certains de mes résultats de travaux avec ce qu'utilise mon associé qui ne connait pas php.
Et en plus, ca me permet de continuer à apprendre php et sa suite car je vais encore avoir besoin de php à l'avenir.
Le meilleur pour apprendre n'est pas de contourner par autre chose mais de persévérer dans ce qu'on travail.
Oui, il m'est arrivé de copier/coller une liste dans excel ou oo de supprimer ce qui est en trop et d'exporter en csv mais pas la solution pour bien apprendre... ;)

Re: Parser un tableau html

par sirakawa » 14 oct. 2012, 21:37

Sans PHP, Bibi la bidouille propose ça (testé avec Open Office, donc il faudra trouver les commandes équivalentes chez Micromou) qu'il a fait 36 fois sur des fichiers scolaires
1) Copier le code du tableau avec son contenu
2) Coller dans un éditeur de textes (j'ai fait avec Bluefish. Il faut un truc qui sache faire du remplacement.)
3) Ajouter au début, s'il n'y est pas <table> et à la fin </table>
4) Remplacer tous les </td> par !</td> (vérifier avant qu'il n'y a pas de ! dans le fichier)
5) Enregistrer sous bidule.html
6) faire afficher ça dans un navigateur quelconque
7) Copier ce qu'on voit
8) Coller dans l'éditeur de textes sans rien toucher
9) Enregistrer sous bidule.csv
10) Ouvrir avec un tableur (ou Importer suivant le cas): OOO va balancer une fenêtre où tu choisis le délimiteur (cocher autres et taper !; et vérifier que les autres choix sont inhibés: on voit le résultat dans la fenêtre) Ok et c'est fini. Suffit d'enregistrer au format Excel pour avoir fini.

Re: Parser un tableau html

par asf21 » 14 oct. 2012, 19:16

Merci de ton intérêt.
Bien entendu, non. Le tableau n'est pas généré sur mon serveur sinon le problème serait vite fait résolu. :wink: lol
Le travail consiste en la récupération d'une liste de nom de produits sur plusieurs pages afin de pouvoir y recoller dans un tableau excel (pas loin de 600 lignes à copier coller!) ce qui me retirerai une somme de travail considérable de saisie texte... Faignasserie, quand tu nous tiens!

Re: Parser un tableau html

par sirakawa » 14 oct. 2012, 19:09

Est-ce toi qui génères le tableau originel ? parce que, dans ce cas, il y a assez simple; mais ça attendra de connaître ta réponse.
Sans quoi, avec des strtok paut-être, puisque tu sais comment le tableau est fichu!

[Résolu] Parser un tableau html

par asf21 » 14 oct. 2012, 18:57

Bonjour à tous.
J'ai un tableau généré en html sous la forme suivante:
<tr class="two">
<td width=75%>
<span class="intitule">RIMM ECC PC800 512Mo</span>
</td>
<td align=center class="old">
<span class="prixeuro">inconnu&nbsp;&euro;</span>
</td>
<td align=center>
<span class=textepetit>Plus en vente</a>
</td>
</tr>
Et bis repetita avec <tr class="one">... ce en alternance une ligne sur deux entre "two" et "one" sur x lignes au total.
Je n'arrive pas à parser correctement avec des regexp en php et ca me gave...
J'ai bien tenté avec cette routine mais 1) ca me retourne n'importe quoi ou rien et 2) ca ne lit pas ligne par ligne suivant $count...
// ouverture page html distante
$url = "lien html";
$file = @fopen($url, 'r');
$contents = file_get_contents($url);

//comptage de lignes contenant "two" et "one"
$word_array = explode("<tr class=\"two\">", $contents);
$word_array2 = explode("<tr class=\"one\">", $contents);

//addition des deux comptages
$count = count($word_array)+count($word_array2);

//suivant le nombre de lignes $count
for ($i=0; $i<$count; $i++)
{
    // On test si le fichier existe ou non
    if ($file)
    //Si il exite on commencer à parser la page et récupérer les données
    {

// on parse suivant la première colonne du tableau 
$matches1 = array();
// recherche ce qu'il y a entre <span class="intitule">......</span>
preg_match_all('#(\<span\sclass\=\"intitule\"\>)(.*?)(\<\/span\>)#si', $contents, $matches1,PREG_PATTERN_ORDER);
$intitule = $matches1[$i][1];

// on parse suivant la deuxième colonne du tableau 
$matches2 = array();
// recherche ce qu'il y a entre <span class="prixeuro">......</span>
preg_match_all('#(\<span\sclass\=\"prixeuro\"\>)(.*?)(\<\/span\>)#si', $contents, $matches2,PREG_PATTERN_ORDER);
$prixeuro = $matches2[$i][1];

// on parse suivant la troisième colonne du tableau 
$matches3 = array();
// recherche ce qu'il y a entre <span class=textepetit>......</span>
preg_match_all('#(\<span\sclass\=textepetit\>)(.*?)(\<\/span\>)#si', $contents, $matches3,PREG_PATTERN_ORDER);
$textepetit = $matches3[$i][1];

       // affiche pour voir 
       echo "Intitulé: ".$intitule." Prix enro: ".$prixeuro." Prix neuf: ".$textepetit."<br/>"; // Pour test
       }
   // incrément pour changer de ligne       
   $id++;
}
fclose($file);
Mon source n'est pas forcément propre ou bien construit et il y a sûrement du dom à utiliser mais j'ai pas encore lu la doc dom et franchement j'ai déjà du mal sans...
Bon en attendant, ca me retourne:
Intitulé: >> Prix enro: inconnu € Prix neuf:
Intitulé: >> Prix enro: Prix neuf:
Intitulé: Prix enro: inconnu € Prix neuf:
Intitulé: Prix enro: Prix neuf:
Intitulé: Prix enro: Prix neuf:
Intitulé: Prix enro: Prix neuf:
Intitulé: Prix enro: Prix neuf:
ect...
Si quelqu'un a une idée, je suis preneur et le remercie par avance! ;)
Cdt.