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 :

Impossible de supprimer dans mon code PHP la toute première table dans DomDocument


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut Impossible de supprimer dans mon code PHP la toute première table dans DomDocument
    Bonjour.

    Je cherche à supprimer le bloc sur l'image suivante: https://i.stack.imgur.com/ldp85.png.

    Et pour ça, j'ai décidé de procéder avec DomDocument comme suit en cherchant à supprimer grâce à str_ireplace, la table ayant la classe CSS contenant box-Advert dans le document $parser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    libxml_use_internal_errors(true);
    $parser = new DOMDocument();
     
    // $parser->loadHTMLFile($url);
    $parser->loadHTMLFile("https://en.wikipedia.org/wiki/Sogou");
     
    $getTableTags = $parser->getElementsByTagName("table");
     
    foreach ($getTableTags as $getTableTag) {
        if (stripos($getTableTag->getAttribute('class'), "box-Advert") !== false) {
            $parser = str_ireplace($getTableTag, "", $parser);
        }
    }
    Mais, mon code ci-dessus me retourne l'erreur suivante:

    Fatal error: Uncaught Error: Object of class DOMElement could not be converted to string in C:\laragon\www\test.php:200 Stack trace: #0 C:\laragon\www\test.php(200): str_ireplace(Object(DOMElement), '', Object(DOMDocument)) #1 {main} thrown in C:\laragon\www\test.php on line 200
    Comment donc réussir à supprimer grâce à DomDocument la toute première table ayant la classe CSS box-Advert plainlinks metadata ambox ambox-content ambox-Advert sur l'URL: https://en.wikipedia.org/wiki/Sogou ???

    Merci de m'aider.

  2. #2
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 108
    Points : 16 640
    Points
    16 640
    Par défaut
    Salut
    Une commande JavaScript
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementsByClassName("box-Advert plainlinks metadata ambox ambox-content ambox-Advert")[0].style.display = "none"
    peut être.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    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 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Citation Envoyé par cheboy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $getTableTags = $parser->getElementsByTagName("table");
     
    foreach ($getTableTags as $getTableTag) {
        if (stripos($getTableTag->getAttribute('class'), "box-Advert") !== false) {
            $parser = str_ireplace($getTableTag, "", $parser);
        }
    }
    Attention, quand tu travailles avec DOMDocument, fais des var_dump pour t'assurer du type de la variable que tu manipules. $getTableTag est un objet DOMNode, pas une chaîne de caractères, donc inutile de t'acharner avec une fonction pour les chaînes comme str_ireplace().

    Pour enlever un nœud tu dois utiliser la méthode DOMNode::removeChild que tu dois appliquer sur le nœud parent du nœud que tu veux enlever.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Pour enlever un nœud tu dois utiliser la méthode DOMNode::removeChild que tu dois appliquer sur le nœud parent du nœud que tu veux enlever.
    J'avais déjà essayer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // On supprime Toutes les Balises <small>...</small>":
    	$get_small_tags = $parser->getElementsByTagName("small");
    	foreach ($get_small_tags as $get_small_tag) {
    		$get_small_tag->parentNode->removeChild($get_small_tag);
    	}
     
    	// On enregistre ici et surtout hors du "foreach" ci-dessus toutes les modifications apportées ci-dessus:
    	$parser->saveHTML();
    Mais ça ne marche pas comme cela se doit. En fait, ça supprime seulement certaines balises <small> mais pas toutes.

    Ça ne supprime pas du toutes les balises <small> contenant le HTML suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <small>(<a href="https://www.wikidata.org/wiki/Q22302383" class="extiw">
    <span class="indicateur-langue" title="Voir l'élément Wikidata correspondant">d</span></a>)</small>
     
    <small>(<a href="https://en.wikipedia.org/wiki/Donna_Zuckerberg" class="extiw">
    <span class="indicateur-langue" title="Article sur Wikipédia en anglais">en</span></a>)</small>

    Comment donc appliquer mon code PHP ci-dessus utilisant DOMNode::removeChild à ce qu'il prenne aussi en compte la suppression des balises <small> du code HTML juste en dessus ???

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 905
    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 905
    Points : 6 694
    Points
    6 694
    Par défaut
    Celà va en fait en supprimer une sur deux, c'est une petite subtilité qu'il faut connaitre! La raison est que les nœuds sont identifiés par la place qu'ils occupent dans l'objet DOMNodeList qui est renvoyé par la méthode DOMDocument::getElementsByTagName. Donc si tu supprimes le premier élément de cette liste de nœuds, tous les nœuds se décalent (le 2e devient le premier, le 3e devient le 2e, etc.).

    Prenons par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $html = <<<'HTML'
    <!DOCTYPE html><html><body>
    <small>0</small>
    <small>1</small>
    <small>2</small>
    <small>3</small>
    </body></html>
    HTML;
    Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $dom = new DOMDocument;
    $dom->loadHTML($html);
     
    $nodeList = $dom->getElementsByTagName('small');
     
    foreach($nodeList as $node) {
        $node->parentNode->removeChild($node);
    }
     
    echo $dom->saveHTML();
    demo.

    Je retire juste une balise sur deux à cause du décalage.

    Alors on peut ruser en parcourant la liste à l'envers (donc en commençant par le dernier nœud) avec une boucle for pour éviter ce décalage. Mais il y a plus malin.
    Comme tu peux le constater, un objet DOMNodeList est un itérateur (tu peux l'utiliser dans une boucle foreach), tu peux donc éviter le problème en créant un array à partir de cet itérateur grâce à iterator_to_array:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $dom = new DOMDocument;
    $dom->loadHTML($html);
     
    $nodeArray = iterator_to_array($dom->getElementsByTagName('small'));
     
    foreach($nodeArray as $node) {
        $node->parentNode->removeChild($node);
    }
     
    echo $dom->saveHTML();
    demo.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 452
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Alors on peut ruser en parcourant la liste à l'envers (donc en commençant par le dernier nœud) avec une boucle for pour éviter ce décalage. Mais il y a plus malin.
    Comme tu peux le constater, un objet DOMNodeList est un itérateur (tu peux l'utiliser dans une boucle foreach), tu peux donc éviter le problème en créant un array à partir de cet itérateur grâce à iterator_to_array:
    Work fine. Grand merci.

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

Discussions similaires

  1. Récupération de variables javascript dans mon code PHP
    Par Yekoo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/12/2010, 20h42
  2. Réponses: 4
    Dernier message: 30/05/2007, 18h05
  3. Erreur dans mon code php que j'arrive à voir
    Par babouba dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2007, 16h48
  4. Réponses: 6
    Dernier message: 19/07/2006, 13h48
  5. Erreur dans mon code PHP
    Par jack_1981 dans le forum Langage
    Réponses: 6
    Dernier message: 12/05/2006, 10h01

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