• Publicidad

Obtener código web desde 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: Obtener código web desde Perl

Notapor nobody » 2011-05-18 15:07 @671

¡¡Sí!! ¡ja,ja,ja! Ya comenté que hacía tiempo que no tocaba Perl... Estaba usando la 5.8. Era otra de mis preguntas en el tintero, si debía actualizar justamente por estos temas ;)

Muchas gracias. Voy a probar la 5.12 y te digo a ver qué tal ;)

Otra cosa. Para compilar... No me acuerdo, usaba (creo) el dpkg, ¿puede ser? Para compilar incluyendo todas las librerías que incluía el código (valga la redundancia).

Gracias de nuevo ;)
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Publicidad

Re: Obtener código web desde Perl

Notapor nobody » 2011-05-18 16:43 @738

¿A qué te refieres con cambiar las comillas?

Can't find string terminator "'" anywhere before EOF at -e line 1.

Porque fijo que este es mi error... :P
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-18 17:10 @757

En UNIX/Linux, se deben usar las comillas simples, para que el terminal no haga una interpolación del contenido. Ejemplo: si ponemos algo como "$variable" entonces creerá que $variable es parte del shell del sistema, y lo intentará interpolar, y claro, no es eso lo que queremos, porque en realidad esa variable forma parte de un programa Perl, no del shell. Por eso lo ponemos entre comillas simples: '$variable'.

En el caso de MSDOS/Windows, es justo al revés (comillas dobles por las simples, y viceversa).

Más información en Why don't Perl one-liners work on my DOS/Mac/VMS system?.

Por aquí ya hemos comentado que no suele ser normal el proceso de compilar las fuentes en un único ejecutable.

De todas maneras, hay unos cuantas hilos hablando del tema. Busca por compilar, pp, PAR, perl2exe, y consulta la pregunta How can I compile my Perl program into byte code or C?.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener código web desde Perl

Notapor nobody » 2011-05-18 18:51 @827

Ok, ok, ¡¡ vale !! :D Ya sé a qué te referías:

perl -MLWP::Simple -E "$contenido = get('http://bolsaphp.sukiweb.net/'); print "$contenido"

Pues sí parece que el problema era de mi versión de Perl ;)

Gracias.

Ahora me devuelve este código de la página donde quiero ver el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- David MartÝn :: Suki_ :: (http://sukiweb.net) -->
  3. <quote>
  4.         <ticker>BBVA.MC</ticker>
  5.         <valor>8,13</valor>
  6.         <fecha>2011-05-18</fecha>
  7.         <hora>17:35:00</hora>
  8.         <volumen>26.271.730</volumen>
  9. </quote>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Bien, esto funciona, ¡je,je,je! Ahora lo que necesito es guardar lo que hay entre <valor> y </valor>... Pero no se me ocurre cómo...

Había pensado con un if() y coger lo que haya entre <valor> </valor> pero para no tener que escribir <valor> en el código... Molaría coger "la cifra que esté separada por una "," ¿no? x,xx o xx,xx... Como mucho siempre va a ser 3 o 4 números... Sabiendo esto, ¿se podría coger esos numeritos, no?
Última edición por explorer el 2011-05-19 03:58 @207, editado 2 veces en total
Razón: Tildes, marcas de XML, signos de interrogación
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor ileiva » 2011-05-18 21:06 @921

Sí, se puede :)

Sólo basta algo de expresiones regulares.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use LWP::Simple;
  3. use strict;
  4.  
  5. my $contenido = get('http://bolsaphp.sukiweb.net');
  6. my @valores;
  7.  
  8. while ($contenido =~ m/(\d{1,3},\d{1,3})/g) {
  9.         print $1, "\n";
  10.         # se almacena para posterior uso
  11.         push(@valores, $1);
  12. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que hace es tomar dos enteros (\d) que tengan entre 1 y 3 dígitos ({1,3}) y estén separados por una coma. El while junto con el modificador g permiten que se analicen todos las ocurrencias en $contenido y no se detenga a la primera que encuentre.

La expresión regular la hice tomando en cuenta lo que está en el index de la web. Supongo que eso era lo que buscabas.

NOTA: Luego de analizar los resultados obtenidos y suponiendo que lo que quieres obtener es el dato valor en la web que mencionas, el código anterior además considera el dato cambio como ocurrencia válida. Para evitar aquello la expresión debería quedar así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contenido =~ m/valor">(\d{1,3},\d{1,3})/g
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


NOTA 2: La página a la que haces referencia en el post no devuelve ningún resultado en formato XML.

Saludos.
Avatar de Usuario
ileiva
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2011-04-23 03:25 @184
Ubicación: Santiago, Chile

Re: Obtener código web desde Perl

Notapor nobody » 2011-05-19 03:34 @190

¡Me gusta la respuesta! Pero esto lo hago para refrescarme la memoria... ¿Sabes algún manual donde venga bien explicado el tema éste de los modificadores?

Por ejemplo, 1,3, ¿por qué es buscar un valor de 3 cifras y no números entre el 1 y el 3? ¿Cómo es para decir que estén separados por una ","?

Tendría que ser de 4, por eso...

Por ejemplo, la $1 es una variable global, ¿no? ¿Que se refiere... a... lo que este en 1ª posición?

Es que esto lo hago para refrescarme la memoria, no quiero copiar y pegar :( Está bien la explicación y lo entiendo bastante bien pero me gustaría saber qué hace cada letra y cada símbolo, ¿sabes?

Lo que yo decía era sin tener que poner valor> porque me parecía un poco cutre xDD Pero bueno, si no se puede hacer de otra forma lo haremos así ;)

¡¡ Muchas gracias !!

Otra cosa, lo del tema del xml solo los usuarios registrados pueden usar la API de compra / venta...

Pero bueno, sí... También se podría hacer sobre el index ;) Todavía no sé cómo lo haré :D Porque se me han ocurrido nuevas ideas al decir lo del index ¡je,je,je,je! ;)
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor ileiva » 2011-05-19 04:33 @231

Claro, en este mismo sitio hay dos tutoriales enfocados a expresiones regulares[1][2], ahí están las respuestas a tus dudas. :)

Respecto a la solución propuesta, bueno, esa es la única manera que se me ocurre por el momento, quizás alguien más en el foro tenga una mejor idea. :P

Otra cosa, realizar peticiones a páginas que requieren autenticación es un poco más complejo que lo hecho hasta ahora. Si te interesa puedes echarle un vistazo al módulo WWW::Mechanize.

Saludos.
Avatar de Usuario
ileiva
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2011-04-23 03:25 @184
Ubicación: Santiago, Chile

Re: Obtener código web desde Perl

Notapor explorer » 2011-05-19 05:06 @254

nobody escribiste:¿Sabes algún manual donde venga bien explicado el tema éste de los modificadores?
Puedes empezar por la página Expresión regular, de la Wikipedia.

nobody escribiste:Por ejemplo, 1,3, ¿por qué es buscar un valor de 3 cifras y no números entre el 1 y el 3? ¿Cómo es para decir que estén separados por una ","?
El 1,3 indica que esperamos un mínimo de 1 dígito y un máximo de 3 dígitos.

nobody escribiste:Por ejemplo, la $1 es una variable global, ¿no? ¿Que se refiere... a... lo que este en 1ª posición?
$1 se refiere a lo capturado por el primer par de paréntesis del patrón de la exp. reg.

nobody escribiste:Lo que yo decía era sin tener que poner valor> porque me parecía un poco cutre xDD Pero bueno, si no se puede hacer de otra forma lo haremos así ;)
Es necesario poner valor>, porque sino, Perl no sabría de qué etiqueta estamos hablando. Se puede hacer de otras maneras. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$contenido =~ m/valor>(.+?)</;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

con esto, capturamos todo lo que haya entre las etiquetas <valor>. Quedaría por traducir $1 a un número, teniendo en cuenta que habría que "interpretar" el significado de la ",".

Por ejemplo, si decidimos que la coma es un separador decimal, podemos cambiarlo a '.', que es separador decimal anglosajón (y que es el que Perl entiende), para luego pasarlo a un número de punto flotante:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my($valor) = $contenido =~ m/valor>(.+?)</;
$valor =~ s/[,]/./;   # ya tenemos el número
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14477
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Obtener código web desde Perl

Notapor nobody » 2011-05-19 07:25 @350

Perfecto, ahora me voy a currelar... Cuando vuelva me estudio todo. :D

El tema de autentificarse, lo puedo hacer por la API key que es mi contraseña de usuario en hexadecimal ;) Por eso no hay problema.

Ok, era solo para hacer algo más "sofisticado", sin tener que usar valor pero bueno, así va bien también ;)

Luego os digo cómo va quedando y qué se me ocurre ;)

¡¡ Gracias a los dos !!
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

Re: Obtener código web desde Perl

Notapor nobody » 2011-05-19 15:52 @702

Entonces, ¿Perl no interpreta las ","? ¿Hay que cambiar la "," por un "."?

Hummm... Bueno, me ha venido bien la página de expresiones :D Ahora entiendo todo perfectamente :D (o eso creo).

my($valor) = $contenido =~ m/valor>(.+?)</;

Eso significa que dentro de contenido buscaremos valor> y cualquier carácter hasta <...

¿Qué pasaría si no pusiéramos el +??

Y luego, hay que substituir la ',' por un punto:

$valor =~ s/[,]/./; # ya tenemos el número

EDITO: No entiendo muy bien el porqué de substituir la "," ... A mi me imprime el precio con la "," :S

¿Es para futuras operaciones?
nobody
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2011-05-15 10:11 @466

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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