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

Langage PHP Discussion :

Récupérer un "a href" avec DOM [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut Récupérer un "a href" avec DOM
    J'ai le tableau suivant (ici, je n'affiche qu'une ligne pour des soucis de lisibilité) dans une url distante.

    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
    <table id="tablepress-851" class="tablepress tablepress-id-851">
    	<thead>
    		<tr class="row-1 odd">
    			<th class="column-1">N&deg;</th>
    			<th class="column-2">&nbsp;</th>
    			<th class="column-3">Chaine</th>
    			<th class="column-4">Evolution Abonn&eacute;s</th>
    			<th class="column-5">Abonn&eacute;s</th><th class="column-7">Vues</th>
    		</tr>
    	</thead>
    	<tbody class="row-hover">
    		<tr class="row-2 even">
    			<td class="column-1" style="vertical-align:middle;"><strong>1</strong></td>
    			<td class="column-2" style="vertical-align:middle;"><a href="https://www.youtube.com/user/aMOODIEsqueezie" target="_blank"><img src="https://yt3.ggpht.com/-PZerjsxPjTQ/AAAAAAAAAAI/AAAAAAAAAAA/209pUVEYY80/s88-c-k-no/photo.jpg" width="68" height="68" class="alignnone" border="0" /></a></td>
    			<td class="column-2" style="vertical-align:middle;"><a href="https://www.youtube.com/user/aMOODIEsqueezie" target="_blank"><strong>SQUEEZIE</strong></a></td>
    			<td class="column-4" style="vertical-align:middle;">231 301</td>
    			<td class="column-5" style="vertical-align:middle;">8 576 763</td>
    			<td class="column-6" style="vertical-align:middle;">3 785 925 482</td>
    		</tr>
    	</tbody>
    Je cherche à parser ce tableau et donc récupérer les données de chaque ligne/colonne, notamment l'url et le lien vers l'imagette. J'ai essayé avec la ligne en gras mais ça ne fonctionne pas.

    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
    <?php
    $content = file_get_contents($url);
    $dom = new DOMDocument();
    $dom->loadHTML($content);
    $tables = $dom->getElementsByTagName('table');
    $table = $tables->item(0);
    $rows = $table->getElementsByTagName("tr");
    foreach ($rows as $row) {
    	$cells = $row -> getElementsByTagName('td');
    	$classement = $cells->item(0)->nodeValue;
    	$nom = $cells->item(2)->nodeValue;
    	$url_chaine=$cells->item(2)->getAttribute('href')->item(0)->nodeValue;
    	$nb_abonnes = $cells->item(4)->nodeValue;
    	$nb_vues = $cells->item(5)->nodeValue;
    	echo $url_chaine;
    }
    ?>
    J'ai l'erreur suivante: Fatal error: Call to a member function getAttribute() on a non-object in /var/www/wordpress/dlweb-doc/influence_panel.php on line 16

    Merci.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    278
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 278
    Points : 132
    Points
    132
    Par défaut
    C'est bon, j'ai trouvé!

    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
     
    <?php
    $content = file_get_contents($url);
    $dom = new DOMDocument();
    $dom->loadHTML($content);
    $tables = $dom->getElementsByTagName('table');
    $tds = $dom->getElementsByTagName('td');
    $trs = $dom->getElementsByTagName('tr');
    $table = $tables->item(0);
    $rows = $table->getElementsByTagName("tr");
    foreach ($rows as $row) {
    	$tags_td = $row -> getElementsByTagName('td');
    	$tags_ahref = $row -> getElementsByTagName('a');
     
    	$classement = $tags_td->item(0)->nodeValue;
    	$nom = $tags_td->item(2)->nodeValue;
    	foreach ($tags_ahref as $tag_ahref) 
    	{
    		$url_chaine = $tag_ahref->getAttribute('href');
    	}
    	$nb_abonnes = $tags_td->item(4)->nodeValue;
    	$nb_vues = $tags_td->item(5)->nodeValue;
    ?>

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    À la bonne heure !

    À lire tes deux dernières discussions, j'ai remarqué que tu devais passer par un proxy pour atteindre l'url distante. Ce qui explique que tu utilises file_get_contents (après avoir défini le contexte de flux) pour charger le contenu du fichier dans une chaîne puis ensuite DOMDocument::loadHTML.
    À la place tu peux utiliser directement DOMDocument::loadHTMLFile avec l'URL en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $opts = [
        'http' => [
            'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
            'request_fulluri' => true
        ]
    ];
     
    $context = stream_context_create($opts);
     
    libxml_set_streams_context($context);
     
    $dom = new DOMDocument;
    $dom->loadHTMLFile($url);
    Autre chose, plutôt que de batailler à coups de DOMNode::getElementsByTagName pour atteindre ta cible, tu devrais te pencher sur XPath (via DOMXPath) qui permet d'interroger l'arbre DOM beaucoup plus facilement.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. [DOM] récupérer un attribut d'un xml avec DOM
    Par fonkyom dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 11/03/2008, 15h35
  2. Requete avec quote et double quote
    Par swissmade dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/08/2007, 15h01
  3. [DOM] Récupérer la racine avec DOM
    Par Thanos DeTitan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 22/05/2006, 11h20

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