Inclure/Parser le tableau HTML d'un distant sur sa page web

Petit nouveau ! | 5 Messages

27 avr. 2016, 16:59

Bonjour,
j'essaie depuis plusieurs jours de récupérer/inclure un tableau depuis un site distant via la fonction DOMDocument, en vain. :(
J'utilise cette fonction car elle me parait être la plus simple à mettre en place et la plus "naturelle".
Je précise que je ne suis pas très à l'aise avec le PHP (webdesigner de formation : plutôt orienté graphisme et CSS).

Code sur site distant :
<div>
<div>
<div class="box">
    <div class="head">
        <a href="#">M1</a>
        <a href="#">M2</a>
    </div>

    <table class="grid">
        <thead>
            <tr>
                <td>T1</td>
                <td>T2</td>
                <td>T3</td>
                <td>T4</td>
                <td>T5</td>
                <td>T6</td>
                <td>T7</td>
                <td>T8</td>
                <td>T9</td>
                <td>T10</td>
                <td>T11</td>
                <td>T12</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>A1</td>
                <td>
                    <a href="#">B1</a>
                </td>
                <td>C1</td>
                <td>D1</td>
                <td>E1</td>
                <td>F1</td>
                <td>G1</td>
                <td>H1</td>
                <td>I1</td>
                <td>J1</td>
                <td>K1</td>
                <td>L1</td>
            </tr>
            <tr>
                <td>A2</td>
                <td>
                    <a href="#">B2</a>
                </td>
                <td>C2</td>
                <td>D2</td>
                <td>E2</td>
                <td>F2</td>
                <td>G2</td>
                <td>H2</td>
                <td>I2</td>
                <td>J2</td>
                <td>K2</td>
                <td>L2</td>
            </tr>
            <!-- etc.. -->
        </tbody>
    </table>

    <div class="foot">
        <a href="#">W1</a>
        <a href="#">W2</a>
    </div>
</div>
</div>
</div>
PHP sur mon site :
<?php
$file = "http://site-distant";

$doc = new DOMDocument();
$doc->loadHTMLFile($file);
$xpath = new DOMXpath($doc);

$elements = $xpath->query('//*/table[@class="grid"]');
if (!is_null($elements)) {
	foreach ($elements as $e) {
		$top = trim($xpath->query('thead//td', $e) [0]->nodeValue);
		echo $top;
		}
	}
?>
Via cette fonction, j'arrive à récupérer du contenu (titres ou textes si l'ID ou la Class sont uniques sur la page), mais cela ne fonctionne pas pour les données (<th> et <td>) du tableau.
Mon but final étant de complètement intégrer le tableau dans ma page web (en conservant la même structure/forme), en y ajoutant mon CSS perso.
Merci par avance pour votre aide. :oops:

Mammouth du PHP | 571 Messages

27 avr. 2016, 18:57

bonjour,

tu peux faire une copie de l'élément table (y compris son contenu) au lieu de parser chacun des éléments de la table:
$doc = new DOMDocument(); 
$doc ->loadHTMLFile($file);

$xpath = new DOMXpath($doc );

$table = $xpath->query('//*/table[@class="grid"]')->item(0);

 $html = ""; 
    $children  = $table->childNodes;

    foreach ($children as $child) 
    { 
        $html .= $table ->ownerDocument->saveHTML($child); //construction des sous éléments de la table(thead, tr, td)
    }

//il est possible de mettre en cache les données pour éviter des requêtes http inutiles sur le serveur
//file_put_contents('cache.html', '<table>' . $html . '<table>');
 echo '<table>' . $html . '<table>'; //on affiche la table

Petit nouveau ! | 5 Messages

28 avr. 2016, 10:09

Bonjour,
merci beaucoup pour ce retour.
En effet, la méthode proposée (copier toute la table telle qu'elle) à l'air beaucoup plus appropriée à mon besoin.
Par contre il doit y avoir une erreur dans le code, car seules les balises <table></table> apparaissent, mais sans aucun contenu à l'intérieur. :(

Mammouth du PHP | 571 Messages

28 avr. 2016, 11:14

bonjour,
as-tu bien renseigné l'url du du fichier distant?
$file = "http://site-distant";
$doc = new DOMDocument(); 
$doc ->loadHTMLFile($file);

$xpath = new DOMXpath($doc );

$table = $xpath->query('//*/table[@class="grid"]')->item(0);

 $html = ""; 
    $children  = $table->childNodes;

    foreach ($children as $child) 
    { 
        $html .= $table ->ownerDocument->saveHTML($child); //construction des sous éléments de la table(thead, tr, td)
    }

//il est possible de mettre en cache les données pour éviter des requêtes http inutiles sur le serveur
//file_put_contents('cache.html', '<table>' . $html . '<table>');
 echo '<table>' . $html . '</table>'; //on affiche la table
Modifié en dernier par yann18 le 28 avr. 2016, 14:38, modifié 1 fois.

Petit nouveau ! | 5 Messages

28 avr. 2016, 11:26

Oui oui, bien sur.
J'ai essayé avec d'autres url même (et donc avec d'autres tableaux et d'autres Class), et même problème : le contenu n'apparait pas.

Mammouth du PHP | 571 Messages

28 avr. 2016, 14:36

Et pourtant je viens d'essayer ce même code sur mes serveurs, il fonctionne très bien même si j'ai omis la la balise fermante de la table (</table>) mais ceci n'empêche nullement l'affichage souhaité.

Essaies d'activer le rapport d'erreurs dans le fichier de configuration pour analyser la source du problème
;activation & affichage des erreurs dans le fichier php.ini
error_reporting = E_ALL &  ~E_STRICT
display_errors = On

Petit nouveau ! | 5 Messages

28 avr. 2016, 16:41

Suite à ton retour (et parce que le bout de code php.ini m'a fait flipper, c'est presque du chinois pour moi |*() ), je viens de refaire un test (avec l'appel du tableau d'un simple fichier .html hébergé sur l'un de mes autres sites) et ça fonctionne parfaitement !
Preuve que ton code est bon. =D>
Sauf que.. cela ne fonctionne toujours pas lorsque je veux récupérer les tableaux des sites qui m'intéressent.

La question est donc maintenant de savoir pourquoi cela marche super bien sur un fichier-distant lambda, mais que cela ne marche pas pour mon besoin ?
Cela serait-il dû au site en question ?
Pour info, voici le type de tableaux que je souhaite récupérer/incorporer directement dans ma page web :
http://www.fff.fr/championnats/fff/dist ... -resultats

Code : Tout sélectionner

<table class="classement">

Mammouth du PHP | 571 Messages

29 avr. 2016, 15:36

La question est donc maintenant de savoir pourquoi cela marche super bien sur un fichier-distant lambda, mais que cela ne marche pas pour mon besoin ?
Cela serait-il dû au site en question ?
tu n'as certainement pas le droit de récupérer cette page sans l'accord du propriétaire. Il faut plutôt voir si ce site expose, des flux en rss, les infos dont tu souhaite récupérer.

Petit nouveau ! | 5 Messages

29 avr. 2016, 16:13

Je viens d'en faire la demande à l'instant.
En tous les cas à première vue, rien ne laisse à penser qu'ils proposent un outil de partage style iframe ou flux rss. :(