2011-02-12 21 views
24

Acabo de comenzar a leer documentación y ejemplos sobre DOM, con el fin de rastrear y analizar el documento.DOMDocument en php

Por ejemplo He parte del documento 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 utilizar el código siguiente para obtener todos los tr etiquetas y analizar si hay basura o información dentro de ellos:

$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, yo estoy simplemente cadena despojado sin las etiquetas, por ejemplo:

Crap 

Crap 
Title 
Description 

Pero me gustaría llegar:

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

Cómo mantener nodos HTML (tags)?

+2

Ver [innerHTML en DOMDocument de PHP] (http://stackoverflow.com/questions/2087103/innerhtml-in-phps-domdocument). – netcoder

+2

Su XPath coincide con el div. Para obtener el código HTML que muestra, debe usar consultas/consultas XPath diferentes y luego pasar los resultados a 'echo $ dom-> save ($ node)'. Por favor, aclara lo que estás tratando de obtener. – Gordon

+0

@netcoder innerHTML no es necesario aquí en absoluto. – Gordon

Respuesta

63

Si desea trabajar con DOM, debe comprender el concepto. Todo en un documento DOM, incluido DOMDocument, es un nodo.

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 un DOMDocument es un tipo de nodo de algún tipo, ya sea 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 de arriba 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 sigues el eje hacia el elemento TITLE, verás que tiene una hoja DOMText. Esto es importante porque ilustra una cosa menudo pasado por alto:

<title>The Title</title> 

no es uno, sino dos nodos. Un elemento DOME con un niño DOMText. Del mismo modo, este

<div class="header"> 

es realmente tres nodos: el DOMElement con un DOMAttr la celebración de una DOMText. Dado que todos estos heredan sus propiedades y métodos de DOMNode, es esencial familiarizarse con el DOMNode class.

En la práctica, esto significa que el DIV que ha obtenido está vinculado a todos los demás nodos del documento. Puede ir hasta el elemento raíz o hasta las hojas en cualquier momento. Está todo allí. Solo tiene que consultar o recorrer el documento para obtener la información deseada.

Si lo hace iterando el childNodes del DIV o use getElementByTagName() o XPath depende de usted. Solo tiene que entender que no está trabajando con HTML sin procesar, sino con nodos que representan ese documento HTML completo.

Si necesita ayuda para extraer información específica del documento, debe aclarar qué información quiere obtener de ella. Por ejemplo, se podría preguntar cómo para ir a buscar todos los enlaces de la mesa y luego nos podría responder algo como:

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

Pero a menos que esté más específica, que sólo puede adivinar qué nodos pueden ser relevantes.

Si necesita más ejemplos y fragmentos de código en la forma de trabajar con el DOM navegar a través de mis respuestas anteriores a preguntas relacionadas:

Por ahora, no debería ser un fragmento para cada UseCase básico a medio que puedas tener con DOM.

+2

Gracias Gordon, necesitaba algo como esto para aprender cómo funciona el dom, pero no lo hago Creo que podría usarlo para rastrear la información que necesitaba, porque no siguen ningún estándar y no tienen clases, ID ni nada de eso, solo tablas :(la información fue útil de todos modos para aprender a usar it = D – Saikios

+5

+1 ... He estado buscando un mapa de Nodeville para el ¡el tiempo mas largo! – rdlowrey

4

Para crear un analizador, puede usar htmlDOM.

Es muy fácil de usar el analizador DOM escrito en php. Al usarlo, puede buscar fácilmente el contenido de la etiqueta div. Por ejemplo, encuentre todas las etiquetas div que tengan el atributo id con un valor de text.

$ret = $html->find('div[id=text]'); 
+1

Esto hizo un trabajo mucho mejor para mí. Estaba trabajando con un sitio que tenía html realmente malo. domdocument no pudo encontrar el nodo que yo quería. Esta biblioteca maneja mal html mucho mejor. – metric152

Cuestiones relacionadas