• Publicidad

Rascado html de página de La Sexta

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Rascado html de página de La Sexta

Notapor natxo » 2012-10-27 14:11 @633

Hola.

Para ver los programas de La Sexta en la TV estoy intentando crear una página con los enlaces sin Flash (directamente localizar el archivo mp4) para que mi Popcorn Hour los pueda reproducir.

He empezado por bajar una copia de la página http://www.lasexta.com/videos/programas.html para probar sin conexión. Para ello se puede usar el ejecutable lwp-mirror si tenemos instalada la librería LWP de CPAN:

Sintáxis: [ Descargar ] [ Ocultar ]


Así me guardo el archivo a disco. Desde el mismo directorio ejecuto el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3.  
  4. # global variables
  5. my $programas_url = 'programas.html';
  6.  
  7. die "$!\n" unless -e $programas_url ;
  8.  
  9. # create HTML::TreeBuilder object with $programas_url
  10. use HTML::TreeBuilder;
  11. my $tree = HTML::TreeBuilder->new_from_file( $programas_url ) ;
  12.  
  13. # we want to get the info between <ul> tags with class="page1", "page2", etc.
  14. # Inside the <ul> tag we find the programs and their links. Save that in
  15. # @ul_tags
  16. my @ul_tags = $tree->look_down( _tag => 'ul', class => qr/page\d/, );
  17.  
  18. for my $ul ( @ul_tags ) {
  19.     printf "found new page%s\n", $ul->as_HTML;
  20. }
  21.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Cuando lo ejecuto saco la información que necesito, pero no en el formato que me interesa. Lo que necesito es sacar los enlaces de los programas.

Si saco un Dumper con Data::Dumper de la información que se guarda en $ul, tiene esta pinta:

http://pastebin.com/cpqEiCy7

La información que me interesa aparece a partir de la línea 1053 en el pastebin. Ahí hay una referencia con toda la información que necesito para el paso siguiente: el nombre del programa y la URL.

No me sale desreferenciar todo esto, me lío.

Gracias de antemano por vuestra ayuda.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Re: Rascado html de página de La Sexta

Notapor explorer » 2012-10-27 19:59 @874

En este caso, tenemos una circunstancia excepcional...

Analizando el código, primero con nuestros ojos, vemos algo curioso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <img title="Vídeos de Famosos al volante - PROGRAMAS TV - LA SEXTA"
  2.    src="/clipping/2012/05/04/00454/10.jpg"
  3.    alt="Famosos al volante - PROGRAMAS TV - LA SEXTA"
  4.    href="/videos/famosos-al-volante.html"
  5. />
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo curioso es que las propias imágenes de los programas, contienen tanto el texto del programa, como los enlaces que nos interesan (caso curioso porque las marcas <img> no deberían tener atributos 'href', según el DTD de la primera línea), y además, esta circunstancia no se repite en el resto de la página (bueno, no he mirado con mucho detalle).

Entonces, la búsqueda de lo que queremos es sencilla:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use HTML::TreeBuilder;
  6.  
  7. my $treebuild = HTML::TreeBuilder->new();
  8.  
  9. $treebuild->parse_file('programas.html')      # leemos y analizamos el archivo
  10.     or die "ERROR en el análisis: $!\n";      # o morimos en el intento
  11.  
  12. my @images_href                               # sacamos un listado de <img>
  13.     = $treebuild                              # a partir de este árbol HTML
  14.     ->look_down(                              # mirando por
  15.         _tag => "img",                        # las marcas <img> (claro)
  16.         href => qr(^/videos),                 # y que además tengan un atributo href que comience por '/videos'
  17.     );
  18.  
  19. for my $img (@images_href) {                  # para cada $img encontrada, sacamos los atributos 'alt' y 'href'
  20.     print $img->attr('alt'), " => ", $img->attr('href'), "\n";
  21. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y ya tenemos el listado.

Pero claro, a lo peor un día el webmaster se da cuenta del error, y quita ese atributo.

Mejor probar con XPath:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.10;
  3. use strict;
  4. use warnings;
  5.  
  6. use HTML::TreeBuilder::XPath;
  7.  
  8. my $tree = HTML::TreeBuilder::XPath->new;
  9.  
  10. $tree->parse_file('programas.html');
  11.  
  12. for my $a ($tree->findnodes('//ul[@class[.=~ /^page\d/]]/li/div/a')) {
  13.     say $a->attr('title'), ' => ', $a->attr('href');
  14. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En la ruta vamos indicando exactamente el tipo de nodo que queremos localizar. Y de él sacamos los atributos 'title' y 'href'.

La localización usa una expresión regular para buscar por los nodos <ul> que tengan un 'class' que comience por 'page' y esté seguido por un dígito cualquiera.

Con Mojolicious puedes conseguir la bajada del archivo y la obtención de los resultados con casi el mismo número de líneas que las mostradas aquí.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Rascado html de página de La Sexta

Notapor natxo » 2012-10-28 04:00 @208

Gracias. Veo que necesito aprender qué es XPath :-)
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 30 invitados