Documento DOM en php
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"> </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 tr
etiquetas 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)?
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 DOMDocument
es 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.
childNodes
Depende de usted si lo hace iterando DIV
o 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.
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 div
la etiqueta.
Por ejemplo, busque todas div
las etiquetas que tengan un atributo id
con un valor de text
.
$ret = $html->find('div[id=text]');