DOMDocument en php

Je viens de commencer à lire de la documentation et des exemples sur DOM, afin d'Explorer et d'analyser le document.

Par exemple, j'ai une partie du document ci-dessous:

    <div id="showContent">
    <table>
    <tr>
        <td>
         Crap
        </td>
    </tr>
<tr>
          <td width="172" valign="top"><a href="link"><img height="91" border="0" width="172" class="" src="img"></a></td>
          <td width="10">&nbsp;</td>
          <td valign="top"><table cellspacing="0" cellpadding="0" border="0">
              <tbody><tr>
                <td height="30"><a class="px11" href="link">title</a><a><br>
                    <span class="px10"></span>
                </a></td>
              </tr>
              <tr>
                <td><img height="1" width="580" src="crap"></td>
              </tr>
              <tr>
                <td align="right">
                    <a href="link"><img height="16" border="0" width="65" src="/buy"></a>
                </td>
              </tr>
              <tr>
                <td valign="top" class="px10">
                    <p style="width: 500px;">description.</p>
                </td>
              </tr>
          </tbody></table></td>
        </tr>
    <tr>
        <td>
Crap
        </td>
    </tr>
    <tr>
        <td>
         Crap
        </td>
    </tr>
    </table>
    </div>

J'essaie d'utiliser le code suivant pour obtenir toutes les balises tr et analyser s'il y a de la merde ou des informations à l'intérieur:

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


$tags = $xpath->query('.//div[@id="showContent"]');
foreach ($tags as $tag) {
    $string="";
    $string=trim($tag->nodeValue);
    if(strlen($string)>3) {
        echo $string;
        echo '<br>';
    }
}

Cependant, je reçois juste une chaîne dépouillée sans les balises, par exemple:

Crap

Crap
Title
Description

, Mais je voudrais obtenir:

<tr>
   <td>Crap</td>
</tr>
<tr>
   <a href="link">title</a>
</tr>

Comment conserver les nœuds html (tags)?

24
demandé sur Templar 2011-02-12 21:33:14

2 réponses

Si vous voulez travailler avec DOM, vous devez comprendre le concept. Tout dans un document DOM, y compris le DOMDocument, est un nœud.

Le DOMDocument est une arborescence hiérarchique de nœuds. Il commence par un nœud racine. Ce nœud racine peut avoir des nœuds enfants et tous ces nœuds enfants peuvent avoir des nœuds enfants seuls. Fondamentalement, tout dans un DOMDocument est un type de nœud, qu'il s'agisse d'éléments, d'attributs ou de contenu de texte.

          HTML                               Legend: 
         /    \                              UPPERCASE = DOMElement
       HEAD  BODY                            lowercase = DOMAttr
      /          \                           "Quoted"  = DOMText
    TITLE        DIV - class - "header"
     |             \
"The Title"        H1
                    |
           "Welcome to Nodeville"

Le diagramme ci-dessus montre un DOMDocument avec certains nœuds. Il y a un élément racine (HTML) avec deux enfants (HEAD et BODY). Les lignes de connexion sont appelées axes. Si vous suivez l'axe vers L'élément TITLE, vous verrez qu'il a une feuille DOMText. Ceci est important car il illustre une chose souvent négligée:

<title>The Title</title>

N'Est pas un, mais deux nœuds. Un DOMElement avec un enfant DOMText. De même, ce

<div class="header">

Est vraiment trois nœuds: le DOMElement avec un DOMAttr contenant un DOMText. Parce que tous ces héritent de leur propriétés et méthodes de DOMNode, il est essentiel de vous familiariser avec la classe DOMNode.

En pratique, cela signifie que le DIV que vous avez récupéré est lié à tous les autres nœuds du document. Vous pouvez aller jusqu'à l'élément racine ou jusqu'aux feuilles à tout moment. Tout y est. Il vous suffit d'interroger ou de parcourir le document pour les informations recherchées.

Que vous fassiez cela en itérant le childNodes du DIV ou utilisez {[7] } ou XPath est à vous. Vous il suffit de comprendre que vous ne travaillez pas avec du HTML brut, mais avec des nœuds représentant l'ensemble de ce document HTML.

Si vous avez besoin d'aide pour extraire des informations spécifiques du document, vous devez clarifier les informations que vous souhaitez en extraire. Par exemple, vous pouvez demander comment récupérer tous les liens de la table et ensuite nous pourrions répondre à quelque chose comme:

$div = $dom->getElementById('showContent');
foreach ($div->getElementsByTagName('a') as $link) 
{
    echo $dom->saveXML($link);
}

Mais à moins que vous ne soyez plus précis, nous ne pouvons que deviner quels nœuds pourraient être pertinents.

Si vous besoin de plus d'exemples et d'extraits de code sur la façon de travailler avec DOM parcourez mes réponses précédentes aux questions connexes:

À l'heure actuelle, il devrait y avoir un extrait pour chaque cas d'utilisation de base à moyen que vous pourriez avoir avec DOM.

64
répondu Gordon 2017-05-23 12:32:01

Pour créer un analyseur, vous pouvez utiliser htmlDOM.

Il est très simple facile à utiliser l'analyseur DOM écrit en php. En l'utilisant, vous pouvez facilement récupérer le contenu de la balise div.

, Par exemple, rechercher tous les div balises qui ont l'attribut id, avec une valeur de text.

$ret = $html->find('div[id=text]');
4
répondu lokeshsk 2014-07-01 14:53:41