• Publicidad

Comparar páginas Perl

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

Re: Comparar páginas Perl

Notapor jacks » 2011-06-20 15:30 @688

Y ¿ cuál era el error de la línea 41? ¿ has cambiado algo?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Publicidad

Re: Comparar páginas Perl

Notapor explorer » 2011-06-20 18:41 @820

Faltaba el '<' final del patrón de la expresión regular. Por eso capturaba solo una letra.
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: Comparar páginas Perl

Notapor jacks » 2011-06-23 13:21 @598

Hola explorer. He instalado la nueva versión de entities por si era el problema pero me sigue pasando lo mismo. ¿Tienes alguna ligera idea de por qué me dice esto?


"Malformed UTF-8 character (fatal) at C:/Perl/lib/HTML/Entities.pm line 464"

La línea que dice es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     # Encode control chars, high bit chars and '<', '&', '>', ''' and '"'
  2.             $$ref =~ s/([^\n\r\t !\#\$%\(-;=?-~])/$char2entity{$1} || num_entity($1)/ge;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-06-23 13:47 @616

El error quiere decir que $$ref se ha definido como que contiene una cadena de caracteres codificada en UTF-8, pero la expresión regular (o sea, Perl), se ha encontrado con un carácter que no tiene ninguna correspondencia con el juego de caracteres UTF-8 (carácter malformado, o desconocido).

Es muy posible que sea debido a que la página http://freshmeat.net/ está codificada en UTF-8, y no lo leer tal cual.

Deberás usar un decode() del módulo Encode, para convertir la página leída, de UTF-8 a codificación interna.

O, también, en vez de usar 'UTF-8' como codificación de entrada, usar 'utf8'. Más información en Encode, sección Handling Malformed Data.
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: Comparar páginas Perl

Notapor jacks » 2011-06-23 14:16 @636

No pero no es esa página. Ya te dije que instalé en Windows al final el módulo XML::RSS:FromHTML y estoy usando el código que me escribiste de Marca. El archivo marca.cache me genera más o menos bien pero el marca.xml no genera nada, o sea, está vació me dice:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
No se puede mostrar la página XML
No se puede ver la entrada XML con la hoja de estilo . Corrija el error y haga clic en el botón Actualizar, o inténtelo de nuevo más tarde.


--------------------------------------------------------------------------------

El documento XML debe tener un elemento de nivel superior. Error al procesar el recurso file:///C:/Documents and Settings/J...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Uso la línea:

use Encode qw'decode';
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-06-23 17:19 @763

¿Has descomentado la línea 39? Yo he probado el programa que está en la primera página del hilo, después de las últimas modificaciones, y va bien.

En caso de dudas, mejor publica el programa que estás usando.

¿Puedes saber en qué línea se está produciendo el error? No me refiero al error del HTML::Entities, sino en qué línea del programa tuyo genera ese error.

Para hacer las pruebas, no te olvides de borrar el fichero de caché en cada ocasión. Si no, no genera el xml. Para mayor seguridad, elimina también el Marca.xml anterior.

A mí me ha funcionado bien con la línea 39, pero es posible llamar a una función llamada passthru(), que indica los valores que se usarán en la creación del objeto XML::RSS. Por ejemplo, podemos indicar la versión RSS para que sea v2.0. O el 'encoding' de salida, a otro que no sea el de por defecto 'UTF-8'.

Según la documentación de XML::RSS::FromHTML, XML::RSS activa la bandera de que las cadenas de caracteres analizadas son todas del tipo UTF-8.

He escrito una variación, para que el xml de salida está en codificación 'iso-8859-15' (la misma que la página de partida), y además, que no cree entidades XML (por lo que el fichero resultado estará completamente codificado en 'iso-8859-15').

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #
  3. # Análisis del diario Marca
  4. # Joaquín Ferrero. 20110624
  5. #
  6. use strict;
  7. use warnings;
  8.  
  9. use utf8;                               # este programa está escrito en codificación utf8
  10.  
  11. package Marca;
  12.  
  13. #use Encode qw'decode';
  14. use base 'XML::RSS::FromHTML';
  15.  
  16. sub init {
  17.     my $self = shift;
  18.     # configuración
  19.     $self->name('Marca');
  20.     $self->url('http://www.marca.com/futbol/1adivision.html');
  21.     $self->passthru({encoding => 'iso-8859-15', encode_output => 0 });          # condiciones de la salida
  22. }
  23.  
  24. sub defineRSS {
  25.     my $self = shift;
  26.     my $xmlrss  = shift;
  27.     # definiciones del RSS generado
  28.     $xmlrss->channel(
  29.         title       => 'Fuente de titulares de Marca.com, Fútbol 1ª div.',
  30.         description => 'Titulares de la 1ª división de Fütbol en España',
  31.     );
  32. }
  33.  
  34. sub makeItemList {
  35.     my $self = shift;
  36.     my $html = shift;
  37.  
  38.     # interpretamos el código HTML y crear con ello una lista
  39.     my @list;
  40.  
  41. #    $html = decode('iso-8859-15', $html);
  42.  
  43.     while ($html =~ m|<h3><a href="(.*?)" title="(.*?)".+?<p>(.+?)<|smg){
  44. #        print "[$1][$2][$3]\n";
  45.  
  46.         push(@list,{
  47.             link        => $1,
  48.             title       => $2,
  49.             description => $3,
  50.         });
  51.     }
  52.     return \@list;
  53. }
  54.  
  55. sub addNewItem {
  56.     my $self = shift;
  57.     my ($xmlrss,$eachItem) = @_;
  58.     # crear cada elemento del RSS usando el método XML::RSS->add_item
  59.     $xmlrss->add_item(
  60.             link        => $eachItem->{link       },
  61.             title       => $eachItem->{title      },
  62.             description => $eachItem->{description},
  63.     );
  64. }
  65.  
  66.  
  67. #### nuestro programa principal
  68. package main;
  69. #use Marca;                      # No es necesario incluirle, porque está antes
  70.  
  71. my $rss = Marca->new();
  72. $rss->update;
  73.  
  74. __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Notas:
* el use utf8; solo es necesario si estás trabajando (editando este programa) en una terminal o editor de textos con codificación utf8, porque en las líneas 29 y 30 hay caracteres tildados, y debemos indicarle a Perl en qué codificación están. Una forma de evitar este lío sería que los caracteres de esas líneas estuvieran descritos como entidades unicode, como se describe en el módulo charnames. Si estuvieras trabajando en otra codificación (distinta de iso-8859-1 y utf8), lo puedes indicar con el pragma encoding.

* en la línea 21 es donde está la magia de esta última versión: indicamos la codificación de salida y que no genere entidades XML. Editando el xml resultado, se ve la diferencia (más abajo).

* he comentado las líneas 13 y 41, porque ya no son necesarias (estoy indicando antes que la codificación de salida es la misma que la de entrada. No es muy ortodoxo, pero funciona).

* la expresión regular de la línea 43 se ha cambiado, porque los señores de Marca permiten poner titulares en la página pero sin enlace (sin href). He cambiado los cuantificadores '+' por '*'.

El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="iso-8859-15"?>
  2.  
  3. <rdf:RDF
  4. xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  5. xmlns="http://purl.org/rss/1.0/"
  6. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  7. xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
  8. xmlns:dc="http://purl.org/dc/elements/1.1/"
  9. xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
  10. xmlns:admin="http://webns.net/mvcb/"
  11. >
  12.  
  13. <channel rdf:about="">
  14. <title>Fuente de titulares de Marca.com, Fútbol 1ª div.</title>
  15. <link></link>
  16. <description>Titulares de la 1ª división de Fütbol en España</description>
  17. <items>
  18.  <rdf:Seq>
  19.   <rdf:li rdf:resource="" />
  20.   <rdf:li rdf:resource="http://www.marca.com/reportajes/2011/01/la_primera_vuelta/seccion_00.html" />
  21.   <rdf:li rdf:resource="http://www.marca.com/deporte/futbol/primera-division/2010-2011/dorsales/" />
  22.   <rdf:li rdf:resource="http://www.marca.com/2010/08/13/multimedia/graficos/1281720946.html" />
  23.   <rdf:li rdf:resource="http://www.marca.com/2009/11/13/multimedia/graficos/1258122822.html" />
  24.   <rdf:li rdf:resource="http://www.marca.com/2009/02/07/futbol/equipos/real_madrid/1234005565.html" />
  25.   <rdf:li rdf:resource="http://www.marca.com/edicion/marca/otros_deportes/graficos/es/desarrollo/1046308.html" />
  26.   <rdf:li rdf:resource="http://www.marca.com/edicion/marca/otros_deportes/graficos/es/desarrollo/1079288.html" />
  27.  </rdf:Seq>
  28. </items>
  29. </channel>
  30. <item rdf:about="">
  31. <title>Resumen 2010-2011</title>
  32. <link></link>
  33. <description>El Barcelona pudo con el 'efecto Mou'. Deportivo, Hércules y Almería descienden.</description>
  34. </item>
  35. <item rdf:about="http://www.marca.com/reportajes/2011/01/la_primera_vuelta/seccion_00.html">
  36. <title>1ª Vuelta</title>
  37. <link>http://www.marca.com/reportajes/2011/01/la_primera_vuelta/seccion_00.html</link>
  38. <description>Consulta todos los detalles que nos han dejado los primeros cuatro meses de competición</description>
  39. </item>
  40. <item rdf:about="http://www.marca.com/deporte/futbol/primera-division/2010-2011/dorsales/">
  41. <title>Todos los dorsales</title>
  42. <link>http://www.marca.com/deporte/futbol/primera-division/2010-2011/dorsales/</link>
  43. <description>Consulta todos los dorsales de los jugadores de la Liga BBVA</description>
  44. </item>
  45. <item rdf:about="http://www.marca.com/2010/08/13/multimedia/graficos/1281720946.html">
  46. <title>La nueva perla del fútbol</title>
  47. <link>http://www.marca.com/2010/08/13/multimedia/graficos/1281720946.html</link>
  48. <description>Analizamos todas las cualidades del nuevo jugador del Real Madrid.</description>
  49. </item>
  50. <item rdf:about="http://www.marca.com/2009/11/13/multimedia/graficos/1258122822.html">
  51. <title>Iniesta, el crack silencioso</title>
  52. <link>http://www.marca.com/2009/11/13/multimedia/graficos/1258122822.html</link>
  53. <description>Descubre todos los secretos del juego de Iniesta y su regate con sello propio.</description>
  54. </item>
  55. <item rdf:about="http://www.marca.com/2009/02/07/futbol/equipos/real_madrid/1234005565.html">
  56. <title>Raúl González Blanco</title>
  57. <link>http://www.marca.com/2009/02/07/futbol/equipos/real_madrid/1234005565.html</link>
  58. <description>No te pierdas el gráfico sobre el '7' blanco tras convertirse en el máximo goleador de la historia del Madrid.</description>
  59. </item>
  60. <item rdf:about="http://www.marca.com/edicion/marca/otros_deportes/graficos/es/desarrollo/1046308.html">
  61. <title>Leo Messi</title>
  62. <link>http://www.marca.com/edicion/marca/otros_deportes/graficos/es/desarrollo/1046308.html</link>
  63. <description>Diseccionamos las jugadas favoritas del azulgrana Leo Messi</description>
  64. </item>
  65. <item rdf:about="http://www.marca.com/edicion/marca/otros_deportes/graficos/es/desarrollo/1079288.html">
  66. <title>Kun Agüero</title>
  67. <link>http://www.marca.com/edicion/marca/otros_deportes/graficos/es/desarrollo/1079288.html</link>
  68. <description>Analizamos todas sus características: remate, regates, control...</description>
  69. </item>
  70. </rdf:RDF>
  71.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Observar que la cabecera marca que todo lo que sigue está en 'iso-8859-15'; y que todos los caracteres tildados, son de justo esa codificación, no son entidades XML.
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: Comparar páginas Perl

Notapor jacks » 2011-06-24 08:27 @393

Gracias por todo lo que me estás ayudando, explorer. He probado el nuevo programa y ya no me da ese error pero me salen estos errores al ejecutarlo y en el xml lo siguiente:


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
No se puede mostrar la página XML
No se puede ver la entrada XML con la hoja de estilo XSL. Corrija el error y haga clic en el botón Actualizar, o inténtelo de nuevo más tarde.


--------------------------------------------------------------------------------

La etiqueta de fin 'channel' no coincide con la etiqueta de inicio 'description'. Error al procesar el recurso file:///C:/D...

</channel>
--^
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Adjuntos
error.JPG
error.JPG (27.01 KiB) Visto 764 veces
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

Re: Comparar páginas Perl

Notapor explorer » 2011-06-24 10:20 @472

Los mensajes de error de la captura de pantalla indican que la página leída está codificada en utf-8...

No lo acabo de entender... la página NO está en utf-8, sino en iso-8859-15.

¿Seguro que has borrado los ficheros Marca.xml y Marca.cache antes de la prueba?
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: Comparar páginas Perl

Notapor explorer » 2011-06-24 10:37 @484

Añado...

si dentro del init() pones una línea, al final, así:

$self->debug(1);

entonces se activará el modo de depurado, y el módulo grabará en disco los ficheros y valores intermedios con los que está trabajando.

Por ejemplo, me ha generado un Marca.html, que es una copia del HTML que se ha bajado de la web.

Mirando en el interior (por ejemplo, con un visor hexadecimal), se ve que, efectivamente, la codificación es iso-8859-15... así que, entre medias, lo estás convirtiendo a otra cosa... o es que XML::Parse está haciendo de las suyas...
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: Comparar páginas Perl

Notapor jacks » 2011-06-24 10:57 @498

Ok, voy a probar a ver. Una cosa: ¿el programa solo funciona con páginas programadas en HTML, no?
jacks
Perlero nuevo
Perlero nuevo
 
Mensajes: 148
Registrado: 2011-04-05 11:14 @510

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron