IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] Impossible de parser correctement table html domelement


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 30
    Points
    30
    Par défaut [DOM] Impossible de parser correctement table html domelement
    Bonjour, j'aimerais bien parser une simple table html.
    Cependant j'ai un petit problème, d'habitude je parse des fichier xml que je créé moi même avec de bonne balise mais là j'ai pas le choix que de m'adapter au code html que je télécharge d'une page.

    Le problème c'est que j'arrive pas a créé une variable result avec les element en dehors du span que je parcoure.


    J'ai refais un petit code qui résume bien mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    	$html = '<table id="campagne">
    				<tr>
    					<td><span class="date">27/10</span></td>
    					<td><span class="time">16h</span></td>
    					<td>
    						Pomme
    						<span>Poire</span>
    						Cerise
    						<span>Peche</span>
    						<span class="intru">voiture</span>
    						banane
    					</td>
    				</tr>
    				<tr>
    					<td><span class="date">27/10</span></td>
    					<td><span class="time">16h</span></td>
    					<td>
    						Pomme
    						<span>Poire</span>
    						Cerise
    						<span>Peche</span>
    						<span class="intru">voiture</span>
    						banane
    					</td>
    				</tr>
    			</table>';
     
    	$dom = new DOMDocument();
    	$dom->loadHTML($html);
     
    	$res = $dom->getElementById('campagne'); // selectionne le bon table
    	$res = $res->getElementsByTagName('tr'); // le tr de table
     
    	$i=0; $result = array(); // pour le resulta final
    	foreach($res as $td) {
    		$span = $td->getElementsByTagName('span');
    		$result[$i]['data'] = '';
    		foreach ($span as $cell) {
    			$class = $cell->getAttribute('class');
    			if ($class != "intru") {
    				echo 'node: '.$cell->nodeValue.'<br />';
    				if (($class == 'date') || ($class == 'time')) {
    					$result[$i][$class] = $cell->nodeValue;
    				}
    				else $result[$i]['data'] .= $cell->nodeValue."; ";
    			}
    			echo 'TEST: '.$cell->parentNode->nodeValue.'<br />';
    		}
    		echo '<hr />';
    		$i++;
     
    	}
    	echo '<pre>';
    	print_r($result);
    	echo '</pre>';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    node: 27/10
    TEST: 27/10
    node: 16h
    TEST: 16h
    node: Poire
    TEST: Pomme Poire Cerise Peche voiture banane
    node: Peche
    TEST: Pomme Poire Cerise Peche voiture banane
    TEST: Pomme Poire Cerise Peche voiture banane
     
    Array
    (
        [0] => Array
            (
                [data] => Poire; Peche; 
                [date] => 27/10
                [time] => 16h
            )
     
        [1] => Array
            (
                [data] => Poire; Peche; 
                [date] => 27/10
                [time] => 16h
            )
     
    )
    J'arrive a mettre 'date' et 'time' sans problème ainsi que 'data' dans l'array avec les element dom dans le span du td. Mais pour pomme cerise banane qui et en dehors du span c'est autre chose.

    alors j'ai essayer pour tester $cell->parentNode->nodeValue qui retourne
    "Pomme Poire Cerise Peche voiture banane"
    Sa me renvois le contenu du tr sans balise ainsi qu'avec le span class="intru" que je voudrais exclure pour pas avoir voiture dans la liste des fruit.

    J'aimerais bien avoir dans data -> Pomme Poire Cerise Peche banane.

    merci d'avance

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Ce qu'il faut comprendre c'est que la structure de td est du type dites "mixed" et que vous voulez les infos residées dans des noeuds du type texte. Donc, utilisant getElementsByTagName('span') est certainement insufficent.

    Je peux vous montrer comment faire dans cette situation concrète à partir de $res identifant le tableau... avec les moyens purement dom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    //$res identifant le bon tableau
    if ($res!=null) {
        $trlist = $res->getElementsByTagName('tr');
        $i=0; $result = array(); // pour le resulta final
        foreach($trlist as $tr) {
            if ($tr->hasChildNodes()) {
                $tdlist=$tr->childNodes;
                foreach($tdlist as $td) {
                    if ($td->hasChildNodes()) {
                        $nodes = $td->childNodes;
                        $result[$i]['data'] = '';
                        foreach ($nodes as $node) {
                            if ($node->nodeType == XML_TEXT_NODE) {
                                if (trim($node->nodeValue)!="") {
                                    $result[$i]['data'] .= trim($node->nodeValue)."; ";
                                }
                            } elseif ($node->nodeType==XML_ELEMENT_NODE) {
                                if ($node->nodeName=='span') {
                                    $class = $node->getAttribute('class');
                                    if ($class != "intru") {
                                        if (($class == 'date') || ($class == 'time')) {
                                            $result[$i][$class] = $node->nodeValue;
                                        } else {
                                            $result[$i]['data'] .= trim($node->nodeValue)."; ";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            $i++;
        }
        echo '<pre>'."\n";
        print_r($result);
        echo '</pre>';
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 30
    Points
    30
    Par défaut
    Bonjour tsuji, un grand merci pour le temps passer sur ce morceau de code

    Sa marche comme je voulais et c'est propre, je commençais à désespérer sur mon problème, encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] Impossible de "parser" un fichier HTML avec simple DOM
    Par tomcat91fr dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 11/03/2014, 20h11
  2. [DOM] Conversion table html -> array php
    Par koopek dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 04/01/2014, 10h09
  3. Parser une page HTML avec Simple html dom parser
    Par thelover2fr dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 24/05/2012, 13h26
  4. [DOM] Utilisation du DOM pour parser une page HTML en php
    Par chabliya dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/05/2012, 21h13
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo