PHP -manipulando el DOM
Este artículo es una introducción a utilizar DOM (Document object Model) con PHP
La extensión DOM permite manipular documentos XML mediante la API DOM con PHP. Cuando se habla de la API DOM en la documentación oficial no explica si se trata la API DOM de HTML o se trata de la extensión.
La clase DOMDocument
La clase DOMDocument representará un documento html o xml.
Para empezar a trabajar con el DOM con PHP deberás crear un nuevo objeto DOMDocument.
En el ejemplo siguiente imprimiré lo que está en body:
Using dom extension$doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML("<body><article><h2>esto es un articulo</h2><p>cuerpo del articulo</p></article></body>"); $body = $doc->getElementsByTagName('body')->item(0); $newdoc = new DOMDocument(); $node = $newdoc->importNode($body, true); $newdoc->appendChild($node); $html = $newdoc->saveHTML(); echo $html;
Mis disculpas si el ejemplo es algo difícil de entender, pero de alguna manera habia que emplezar con el manejo del DOM.
En este caso explicaremos línea a línea lo que estamos haciendo:
La primera linea es para poder trabajar con un documento tal como ya dijimos al inicio, en tanto a la función libxml_use_internal_error(true) es para que no nos muestre un warning esto es debido a que dentro del string que pasaremos a loadHTML hay código que es HTML 5 y no lo reconocerá del todo.
en la 4ta linea tenemos el metodo getElementsByTagName este metodo obtiene los elementos con la etiqueta especificada en este caso ‘body’ como una lista de Nodos por eso siguiente a dicho metodo tenemos item(0) para obtener el primer nodo de la lista.
Imprimir en pantalla el contenido de un nodo
Estas líneas las he puesto para poder imprimir el nodo aunque en este caso es probable que no las necesitáramos
printing a node$newdoc = new DOMDocument(); $node = $newdoc->importNode($body, true); $newdoc->appendChild($node); $html = $newdoc->saveHTML(); echo $html;
Si solo quisiéramos imprimir lo cargado:
$doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML("<body><article><h2>esto es un artículo</h2><p>cuerpo del artículo</p></article></body>"); $html =$doc->saveHTML(); echo $html;
Recordemos que en el primer ejemplo seleccionamos un elemento del HTML cargado y lo imprimimos en pantalla. Volvamos a ese ejemplo, pero esta vez seleccionemos solo el H2
seleccionando H2$doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML("<body><article><h2>esto es un articulo</h2><p>cuerpo del articulo</p></article></body>"); $h2 = $doc->getElementsByTagName('h2')->item(0); $newdoc = new DOMDocument(); $node = $newdoc->importNode($h2, true); $newdoc->appendChild($node); $html = $newdoc->saveHTML(); echo $html;
Yendo más lejos en conjunto con file_get_contents
si ya viste utilizando-file_get_contents-en-php te imaginaras que podemos hacer manipulando el DOM y dicha función, obtener pedazos enteros de otras paginas como puede ser tweets de personas o publicaciones enteras de redes sociales se hace fácil.
Si parte de tu pagina depende del día a día de otra esto puede ser una buena opción eso si recomendaría que lo obtenido lo guardes en una base de datos, sino tendrás una pagina absolutamente dinámica.
¿Cómo haríamos esto? Primero que nada deberíamos obtener lo que hay entre <html>y</html> por ejemplo página de Google:
Using file_get_content$page = file_get_contents('http://google.com'); $htmlpos = strpos($page,"<html"); $html = substr($p,$htmlpos,strlen($page));
Luego es mas de lo mismo cargo la pagina con loadHTML y obtengo lo que quiero.