• Publicidad

Obtener datos recorriendo código fuente página web

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Obtener datos recorriendo código fuente página web

Notapor decodito » 2013-07-14 05:12 @258

Buenos días, estoy intentando recorrer el código fuente de una página web en busca de los hipervínculos. Todo me funciona bien en las páginas, donde, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <ul class="right_menu"><li><a href="/A6XyLvB4">Untitled</a><span>16 sec ago</span></li><li><a href="/p3Xinsd2">Untitled</a><span>20 sec ago</span></li>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En ese fragmento de código de una web (en este caso, PASTEBIN) consigo obtener los enlaces de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $rsp->content =~ /<ul class=\"right_menu\">(.*)<\/ul><\/div><\/div>/ ) {
  2.     my $pastes  = $1;
  3.     my $counter = 1;
  4.     while ( $pastes =~ s/<li><a href=\"\/(.*?)\">(.*?)<\/a><span>(.*?)<\/span><\/li>// ) {
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Hasta ahí, bien, ya que <ul class="right_menu"><li> aparece unido, y en mi código me recorre sin detectar saltos de línea.

El problema es, que si el código fuente de la página web, en lugar de estar como se presenta, está así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <ul class="right_menu">
  2. <li><a href="/A6XyLvB4">Untitled</a><span>16 sec ago</span></li>
  3. <li><a href="/p3Xinsd2">Untitled</a><span>20 sec ago</span></li>
  4. </ul>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Con ese salto de línea ya no sé cómo recorrer todos los hipervínculos, ya que en cuanto recorre la primera cadena, y detecta la apertura y cierre de <li>, no sigue leyendo datos. Yo quiero que coja todo lo que hay entre <ul class="right_menu"> y </ul>.

Estoy rompiéndome la cabeza y no doy con la tecla...
decodito
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-07-14 05:04 @253

Publicidad

Re: Obtener datos recorriendo código fuente página web

Notapor explorer » 2013-07-14 11:23 @516

Bienvenido a los foros de Perl en Español, decodito.

Prueba a modificar la exp. reg. para que tenga en cuenta el caso de que existan espacios en blanco -incluyendo caracteres de nueva línea- entre las marcas HTML:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($rsp->content =~ /<ul class="right_menu">\s*(.*?)\s*<\/ul>/s) {
  2.     my $pastes  = $1;
  3.     my $counter = 1;
  4.     while ( $pastes =~ s/<li><a href="\/(.*?)">(.*?)<\/a><span>(.*?)<\/span><\/li>// ) {
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La opción '/s' hace que el comodín '.' tenga en cuenta también a los caracteres de nueva línea.

También, si solo quieres extraer los enlaces, puedes usar HTML::LinkExtor, como hemos comentado hace poco.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener datos recorriendo código fuente página web

Notapor decodito » 2013-07-14 14:03 @627

Perfecta la salida, lo he probado y ha quedado impresionante, no sabes lo que te lo agradezco.

Al final lo he dejado así:

if ($rsp->content =~ /<ul class='posts'>\s*(.*?)\s*<\/ul>/s) { # como base para que recoja lo que hay dentro de la clase 'posts' (otra web)

Para recoger la información:

if ($rsp->content =~ /<ul class='posts'>\s*(.*?)\s*<\/ul>/s) {

De tal forma que el código fuente dato por:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <ul class='posts'>
  2. <li><a href='http://www.pagina.es/prueba1.html'>Enlace de pruebas para CGI 1</a></li>
  3. <li><a href='http://www.pagina.es/prueba2.html'>Enlace de pruebas para CGI 2</a></li>
  4. <li><a href='http://www.pagina.es/prueba3.html'>Enlace de pruebas para CGI 3</a></li>
  5. </ul>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me recoge perfectamente en cada variable el vínculo y descripción de principio a fin.

Muchísimas gracias
Última edición por explorer el 2013-07-14 18:57 @831, editado 1 vez en total
Razón: Poner marcas HTML
decodito
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-07-14 05:04 @253

Re: Obtener datos recorriendo código fuente página web

Notapor decodito » 2013-07-14 15:27 @686

Sobre el ejercicio anterior, me ha surgido que la lectura del código fuente de la página no se realiza bien en utf8, aun poniendo en el código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use utf8;
  2. binmode STDOUT, ":encoding(UTF-8)";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La salida del href, en cuanto a palabras, quedan de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Razón donde debe razón
electrónicos donde debe ser electrónicos
años donde debe ser años....
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Alguna idea?
decodito
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-07-14 05:04 @253

Re: Obtener datos recorriendo código fuente página web

Notapor explorer » 2013-07-14 19:24 @850

El 'use utf8' sirve para indicar que el código fuente de tu programa Perl está codificado así.

Y el binmode() que has puesto se refiere a la codificación de la salida de datos, desde tu programa, al exterior, por la salida estándar.

No nos lo dices, pero supondremos que los datos que bajas sí están en utf8. No nos dices con qué método los bajas, pero supondremos que no realiza ningún tipo de cambio de codificación.

En ese caso, lo que hay que hacer es decirle a Perl que lo que hemos bajado está en esa codificación.

Una forma de hacerlo es usando la función

$exito = utf8::decode($texto);

Más información en perldoc utf8.

A partir de ese momento, $texto contendrá una cadena de caracteres codificada en utf8. Más información y ejemplos en el libro "Modern Perl".

Más tarde, si quieres sacar el $texto (o parte de él) al exterior, pues tienes que indicar con el binmode() que pusiste en qué codificación quieres sacarlo. Si tu terminal de pantalla está codificada en utf8, pues te vale con poner la misma línea que tenías antes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener datos recorriendo código fuente página web

Notapor decodito » 2013-07-15 04:11 @216

Sí, estaba utilizando utf8::deco... para recibir los datos pero ha sido un fallo MUY, MUY TONTO, de esos que te llevan horas y luego te dan ganas de pegarte...

Al subirlo al alojamiento se apreciaba todo correctamente... pero era mi terminal de línea de comandos...

Un fallo tonto. Perdón por las molestias explorer, y muchas gracias.
decodito
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-07-14 05:04 @253


Volver a Web

¿Quién está conectado?

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

cron