Documento DOM en php

Resuelto Saikios asked hace 54 años • 2 respuestas

Acabo de comenzar a leer documentación y ejemplos sobre DOM para poder rastrear y analizar el documento.

Por ejemplo, tengo parte del documento que se muestra a continuación:

    <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>

Estoy intentando usar el siguiente código para obtener todas las tretiquetas y analizar si hay basura o información dentro de ellas:

$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>';
    }
}

Sin embargo, solo obtengo una cadena eliminada sin las etiquetas, por ejemplo:

Crap

Crap
Title
Description

Pero me gustaría conseguir:

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

¿Cómo mantener los nodos html (etiquetas)?

Saikios avatar Jan 01 '70 08:01 Saikios
Aceptado

Si quieres trabajar con DOM debes entender el concepto. Todo lo que hay en un documento DOM, incluido el documento DOM, es un nodo.

El DOMDocument es una estructura de árbol jerárquica de nodos. Comienza con un nodo raíz. Ese nodo raíz puede tener nodos secundarios y todos estos nodos secundarios pueden tener nodos secundarios por sí solos. Básicamente, todo en a DOMDocumentes un tipo de nodo de algún tipo, ya sean elementos, atributos o contenido de texto.

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

El diagrama anterior muestra un DOMDocument con algunos nodos. Hay un elemento raíz (HTML) con dos hijos (HEAD y BODY). Las líneas de conexión se llaman ejes. Si sigue el eje hasta el elemento TITLE, verá que tiene una hoja DOMText. Esto es importante porque ilustra algo que a menudo se pasa por alto:

<title>The Title</title>

No es uno, sino dos nodos. Un DOMElement con un hijo DOMText. Asimismo, este

<div class="header">

En realidad son tres nodos: el DOMElement con un DOMAttr que contiene un DOMText. Debido a que todos heredan sus propiedades y métodos de DOMNode, es esencial familiarizarse con la clase DOMNode.

En la práctica, esto significa que el DIV que obtuvo está vinculado a todos los demás nodos del documento. Puedes llegar hasta el elemento raíz o hasta las hojas en cualquier momento. Está todo ahí. Sólo tiene que consultar o recorrer el documento para obtener la información deseada.

childNodesDepende de usted si lo hace iterando DIVo usando getElementByTagName()XPath. Sólo tienes que entender que no estás trabajando con HTML sin formato, sino con nodos que representan todo el documento HTML.

Si necesita ayuda para extraer información específica del documento, debe aclarar qué información desea obtener del mismo. Por ejemplo, podría preguntar cómo recuperar todos los enlaces de la tabla y luego podríamos responder algo como:

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

Pero a menos que sea más específico, sólo podemos adivinar qué nodos podrían ser relevantes.

Si necesita más ejemplos y fragmentos de código sobre cómo trabajar con DOM, consulte mis respuestas anteriores a preguntas relacionadas:

  • https://stackoverflow.com/search?q=user%3A208809+DOM

A estas alturas, debería haber un fragmento para cada UseCase básico o medio que pueda tener con DOM.

Gordon avatar Feb 13 '2011 10:02 Gordon

Para crear un analizador puedes usar htmlDOM .

Es un analizador DOM muy simple y fácil de usar escrito en php. Al usarlo, puede recuperar fácilmente el contenido de divla etiqueta.

Por ejemplo, busque todas divlas etiquetas que tengan un atributo idcon un valor de text.

$ret = $html->find('div[id=text]');
lokeshsk avatar Mar 12 '2014 08:03 lokeshsk