• Publicidad

Extraer titulares de páginas web

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

Extraer titulares de páginas web

Notapor gonzalos » 2009-12-13 17:06 @754

Hola de nuevo.

He estado intentando hacer un pequeño programa que me lea un fichero HTML almacenado en un disco duro y me muestre los titulares de la página utilizando para ello una expresión regular.

He intentado huir del uso de módulos, hasta que pueda entenderlos.

Buscando en Internet encontré una forma de leer un fichero HTML.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
      print "Content-type: text/html\n\n";
      open (HTML, "<../path/to/your/file.htm");
      print <HTML>;
      close (HTML);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Por lo que he intentado adecuarlo a mi programa y he hecho esto

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
      use strict;
      use warnings;
      my $tag_inicial = '<h2>';
      my $tag_final = '</h2>';
      print "Content-type: text/html\n\n" or die $!;
      open (HTML, "<C:/Documents and Settings/Administrador/Escritorio/Wikipedia Portada.htm");
      my @web=<HTML>;
      for my $cadena(@web){
            chomp $cadena;
            if ($cadena=~ m/$tag_inicial(.*?)$tag_final/mgi) {
                print HTML $cadena;
            }
      }
      close (HTML);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El programa me da errores en la apertura del fichero HTML. ¿Alguna idea?

Este es el informe de error

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
readline() on closed filehandle HTML at C:/Documents and Settings/Administrador/Escritorio line 7
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Un saludo
Gonzalo
Última edición por gonzalos el 2009-12-14 13:38 @610, editado 1 vez en total
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Publicidad

Re: Extraer titulares de páginas web

Notapor gonzalos » 2009-12-14 13:45 @614

A ver, sí quiero aprender a usar los módulos, incluso me leí un tutorial de cómo desplegar HTML, pero no me enteré de nada. Y si ya voy justo con las expresiones regulares, tengo un lío con toda la familia picapiedra, como para empezar a utilizar los módulos.

Por eso primero quiero asentar el uso mínimo de las expresiones para luego comenzar a estudiarme los módulos, y ver con qué familiares me salen en el libro de la llama.

Un saludo.
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Extraer titulares de páginas web

Notapor explorer » 2009-12-14 13:50 @618

Disculpas.

Creí que el no uso de los módulos era debido a algún prejuicio o alguna endiablada política empresarial.
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: Extraer titulares de páginas web

Notapor gonzalos » 2009-12-14 15:14 @676

No tienes por qué disculparte.

Lo de "aprender" Perl es por pura curiosidad y como los ratos libre que me deja el trabajo son escasos tengo que ir poco a poco.
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Extraer titulares de páginas web

Notapor creating021 » 2009-12-14 21:41 @945

Creo que el error se da porque el fichero no está abierto.

Modifica
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (HTML, "<C:/Documents and Settings/Administrador/Escritorio/Wikipedia Portada.htm");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (HTML, "<C:/Documents and Settings/Administrador/Escritorio/Wikipedia Portada.htm")
or die "Wikipedia Portada.htm: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para asegurarse que el fichero realmente fue abierto.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Re: Extraer titulares de páginas web

Notapor gonzalos » 2009-12-15 14:16 @636

Después de añadir la línea de "muerte". Me sigue dando el error

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Wikipedia Portada.htm: no such file or directory
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


O sea que no es capaz de abrirlo y la página web, la tengo descargada en el mismo directorio en el que estoy ejecutando el script.

Un saludo
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Extraer titulares de páginas web

Notapor danimera » 2009-12-15 14:23 @641

Wikipedia Portada.htm: no such file or directory

Quiere decir que no encuentra el fichero; fíjate bien en la ruta cuando usas el OPEN;

Aunque no estoy seguro pero creo que las rutas en Windows se usan con \ en vez de /; otra forma es que si está en el mismo directorio que tu script de Perl, pues solo coloca el nombre del fichero sin la ruta.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Extraer titulares de páginas web

Notapor explorer » 2009-12-15 14:40 @653

A Perl le da lo mismo si es '/' o '\'. Y a Windows, desde hace años, también.

Efectivamente, el error indica que no encuentra el fichero en el sitio indicado.

Una forma de saber si estamos construyendo bien la ruta hacia el fichero es usando el comando DIR. Por ejemplo, si queremos acceder a

C:/Documents and Settings/Administrador/Escritorio/Wikipedia Portada.htm

podemos probar a hacer un

DIR C:/Documents and Settings/Administrador/Escritorio/

Si no salen errores, es que la ruta es correcta. Solo quedaría comprobar si el nombre del fichero es correcto.

Atención a los espacios en blanco, que son muy puñeteros (yo nunca permito tenerlos en nombres de directorios y ficheros, para evitar ciertos errores).
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: Extraer titulares de páginas web

Notapor gonzalos » 2009-12-15 17:52 @786

Gracias, de todas formas, llevo algunos días espeso. Debe ser que la única neurona que tengo está de vacaciones.

He (mejor dicho habéis) solucionado el problema del archivo. Ahora lo único que me imprime es

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Content-type: text/html
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y se queda en un bucle. Sin salir al símbolo del sistema.

Desde que tenga algo de tiempo libre, seguiré buscando información.

Un saludo
Gonzalo
gonzalos
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2009-11-27 05:47 @283

Re: Extraer titulares de páginas web

Notapor explorer » 2009-12-15 18:44 @822

Es raro que se quede parado el programa...

Hay que hacer varios cambios fundamentales...

Como estamos haciendo una búsqueda por una página, para localizar marcas de inicio y final, tenemos que trabajar con una única variable escalar. No debemos trabajar con cada línea del fichero. ¿Por qué? Pues porque puede darse el caso de que una marca de inicio esté en una línea, pero la marca de final, esté en otra de las siguientes. De esa manera, nunca encontraremos lo que queremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
      use strict;
      use warnings;
      my $tag_inicial = '<h2>';
      my $tag_final = '</h2>';
      open (HTML, "<C:/Documents and Settings/Administrador/Escritorio/Wikipedia Portada.htm");
      my $pagina_web = join '', <HTML>;
      close (HTML);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ya tenemos nuestra página HTML leída.

Otro cambio fundamental que hay que hacer es cambiar el if() por un while(). Resulta que queremos hacer un bucle por todos los titulares que podamos encontrar a lo largo de la página:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
            while ($pagina_web =~ m/$tag_inicial(.*?)$tag_final/simg) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El bucle funciona gracias al efecto de la opción /g, que, aunque podemos ponerla en un if(), el sitio natural de ella es en combinación con los bucles.

Y la última modificación es cambiar lo que imprimes: en lugar de imprimir la cadena, sacamos lo capturado por los paréntesis, que es el contenido del titular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
                print $1;
            }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Observa que he quitado algunas cosas:
* El Content-type solo sirve si este programa va a funcionar como un CGI. Si lo estás ejecutando desde la consola, sobra.

* No hay chomp(), porque nos dan igual los caracteres de final de línea (en principio).

* He quitado el manejador HTML del último print(), porque... recuerda que lo estabas abriendo en modo de lectura. ¿Para qué quieres imprimir en ese fichero? Si solo querías sacar los titulares por la salida estándar, con un print() normal, te vale.
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

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron