• Publicidad

XML -> RSS

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

XML -> RSS

Notapor Linuxero » 2007-06-07 06:40 @320

¡Hola a todos!

Estoy trabajando con documentos RSS y hago uso de la función parseRSS del modulo XML::RSSLite, así meto en un hash cada una de las partes del RSS (channel, item, description, etc.).

El problema está en que parseRSS se carga literalmente todos los caracteres acentuados, ñ, ç, además de cualquier tag HTML que pueda haber.

Una solución que he encontrado a este problema es usar la función encode_entities (del módulo HTML::Entities) para sustituir estos caracteres problemáticos por su código HTML correspondiente ( p.e. á sería á ), después ejecuto parseRSS y finalmente uso decode_entities para recuperar los caracteres originales (siguiendo con el ejemplo, á sería de nuevo á). Con todo este proceso parseRSS no elimina ningún carácter acentuado ni ñ, etc.

El problema que ocurre con todo esto es que encode_entities también modifica los tags xml del documento RSS (p.e. <channel> pasa a ser lt;channelgt;) y después cuando aplico parseRSS no reconoce el documento que le paso como un RSS, porque no es capaz de reconocer el "tag" lt;channelgt; (espera <channel>). La solución a este nuevo problema: después de encode_entities usar una función propia para restaurar los tags xml (con el ejemplo anterior, lt;channelgt; lo escribo correctamente, o sea <channel>), ahora sí puedo aplicar parseRSS con lo cual reconoce las etiquetas y finalmente uso decode_entities para recuperar los caracteres originales.

Resumiendo la cosa queda así:

Código: Seleccionar todo
encode_entities;
#sustituye los caracteres acentuados, ñ, etc. por su equivalente en HTML, pero también modifica los tags xml (problema con parseRSS)
restaura_tags_xml;
#función propia que restaura los tags xml de mi documento RSS
parse_rss;
#mete en un hash cada una de las partes del RSS
decode_entitites;
#lo contrario a encode_entitites, recupera los caracteres originales de los que están escritos en forma de código HTML


El asunto está en la función que restaura los tags xml: hay que tener en cuenta todos los tags de todos los formatos de documentos RSS (y atom también) para así poder restaurar todas las etiquetas que puedan aparecer. Y francamente, esto no queda muy elegante.

La pregunta es ¿no hay otra forma más sencilla de hacerlo?

Por ejemplo, desmontar el documento RSS en una estructura de árbol para cada uno de los tags y modificar solo el texto sin modificar los tags, y después recuperar el documento RSS original. El problema con esta idea es que no sé ni con qué módulo XML empezar ni qué funciones utilizar. Si alguien tuviera alguna idea, sería de muy muy agradecer.

Gracias.
Linuxero
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-06-07 06:11 @299

Publicidad

Notapor explorer » 2007-06-07 08:48 @408

Bienvenido a los foros de Perl en Español.

Con el módulo XML::RSS puedes crear, parsear y mantener ficheros RSS (internamente usa XML::Parser para el análisis sintáctico).

Por defecto trabaja con codificación utf8, pero se puede poner la que se quiera en la salida (la que admita la función open() con algún layer indicado, como por ejemplo :utf8. Ver PerlIO)
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

Notapor Linuxero » 2007-06-12 21:28 @936

Genial. Gracias.

Utilizo XML::RSS y al parsear los rss (estoy trabajando con rss's de diferentes sitios) me pilla todos los caracteres.

A continuación meto cada una de las partes de cada RSS en una base de datos (uso mysql), y también se guardan todos los caracteres perfectamente.

Después leyendo dicha base de datos construyo un .html y un .rss con por ejemplo, con todos los items (independientemente de su origen) de ayer y hoy.
(items o noticias, como más os guste)

Y ahora los caracteres acentuados, ñ's y demás no se ven correctamente. He puesto lo de la codificación en el comando 'open' para generar los ficheros y nada, no se si con 'print' se puede hacer lo mismo (uso print para escribir línea por línea en el .html y .rss) aunque también he hecho pruebas y tal, pero nada.... sigue igual.
En fin, toda ayuda es poca.

Gracias.
Un saludo.
Linuxero
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2007-06-07 06:11 @299

Notapor explorer » 2007-06-13 01:28 @103

Si suponemos que los caracteres salen bien desde la base de datos, en utf8, ¿has indicado la codificación en la cabecera del HTML y del RSS?

Ejemplo, esta página tiene esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
porque si no lo haces deberás convertir todos los caracteres 'extraños' a 'entidades HTML' (ñ => &ntilde;).

Para esto último, hay funciones en algunos módulos que te pueden ayudar en la conversión.
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

Notapor explorer » 2007-06-13 03:48 @200

Esto puede ser MUY interesante:

A UTF8 round trip with MySQL:
http://www.perlmonks.org/index.pl?node_id=620803
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


Volver a Módulos

¿Quién está conectado?

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