11 agosto, 2008

Parseador simple para HTML/DOM en PHP

SimpleHTMLDom. Documentación. Descargar.

Se trata de un parseador implementado en PHP5+ que facilita enormemente manipular código HTML. Soporta HTML inválido y es capaz de encontrar etiquetas en una página HTML con selectores del estilo de jQuery.

Ejemplos:
  • Obtener elementos de HTML
    // Leer el DOM a partir de la URL
    $html = file_get_html('http://www.google.com/');
    
    // Encuentra todas las imágenes
    foreach($html->find('img') as $element)
           echo $element->src . '
    ';
    
    // Encuentra todos los enlaces
    foreach($html->find('a') as $element)
           echo $element->href . '
    ';
    
  • Modificar elementos HTML
    // Crea una estructura DOM a partir de una cadena
    $html = str_get_html('
    Hola
    Mundo
    '); $html->find('div', 1)->class = 'barra'; $html->find('div[id=hola]', 0)->innertext = 'tonta'; echo $html; // Lo que genera:
    tonta
    mundo
  • Extrae contenido desde HTML
    // Vuelca el contenido (sin etiquetas) de HTML, o sea, convertir a texto
    echo file_get_html('http://www.google.com/')->plaintext;
    
  • Filtrado del código HTML de SlashDot.org
    // Leer el DOM a partir de la URL
    $html = file_get_html('http://slashdot.org/');
    
    // Encontrar todos los bloques de artículos
    foreach($html->find('div.article') as $article) {
        $item['title']     = $article->find('div.title', 0)->plaintext; // extrae el título
        $item['intro']    = $article->find('div.intro', 0)->plaintext;  // extrae la intro
        $item['details'] = $article->find('div.details', 0)->plaintext; // extrae los detalles
        $articles[] = $item;
    }
    
    print_r($articles);
    

14 comentarios:

  1. Pues está fantástico!!!

    ResponderEliminar
  2. Genial justo lo que estaba necesitando!!!

    ResponderEliminar
  3. A mí me sale este error:
    Call to undefinied function file_get_html()

    ResponderEliminar
  4. Probablemente porque no estás incluyendo la librería necesaria, SimpleHTMLDom, que está enlazada al principio del artículo.

    ResponderEliminar
  5. Jeje, pues era eso.
    La verdad es que un par me van a ser muy útiles.
    Gracias :)))

    ResponderEliminar
  6. Lo voy a probar al instante justo lo que andaba necesitando y con poco tiempo para hacerlo yo mismo :D Muchisimas gracias!!

    ResponderEliminar
  7. Hola a todos tengo un problema con un programa que he hecho con la libreria esta, en el servidor de mi casas funciona perfectamente pero al subirla al servidor no funciona aunque no me da ningun tipo de error el firefox se queda en blanco y el explorer me da problemas de conexion. Se le ocurre a alguien algo?

    ResponderEliminar
  8. Para que funcione correctamente se tiene que hacer un include de la librería SimpleHTMLDom.

    Gracias por el aporte, me sera muy util

    ResponderEliminar
  9. prueba agregando esto en el comienzo del codigo
    set_time_limit(3600);
    ini_set('memory_limit', '250M');


    y activa la opcion mostrar errores desde htaccess de seguro de que tu proveedor hosting no lo tiene activo

    ResponderEliminar
  10. Excelente post muchas gracias muy útil realmente

    ResponderEliminar
  11. Anónimo3/6/12, 5:55

    No habia visto este articulo. Excelente!!
    Ahora podre capturar noticias rss y poder ponerlas en mi web con mis propios estilos

    ResponderEliminar
  12. Llevo bastante utilizando este parseador, es fantástico y me quita muchíiiismas horas de trabajo al extraer los datos, lo último fueron 299.000 registros de una base de datos (2.5h con el script), os imagianis cuántas horas serían manualmente?...

    Pero dependiendo de qué se quiere hacer se comiezan a descubrir carencias o limitaciones del parseador, supongo que de ahi viene el tema "Parseador Simple" jejeje

    Lo que pretendo es que el script parsee cierta tabla en el que el ID se genera de manera dinámica. Estoy buscando como poder extraer el ID de la tabla por otras vias para poder enviarselo al script y poder parsear la tabla que contiene ese ID... alguien podría, al menos, señalarme el camino? grácias.

    ResponderEliminar
  13. Me alegro, Carlos. Pero no puedo ayudarte. Hace mucho que dejé estar todo este mundo. Has probado a preguntar en el origen del código (autor)

    ResponderEliminar