• Publicidad

Consulta por expresión regular

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Re: Consulta por expresión regular

Notapor explorer » 2011-06-07 03:56 @205

Quizás no haya un solo espacio entre el </span> y el </div>...

P.D. Recuerda que este es el foro Intermedio... aquí hay menos pistas que en el foro Básico ;)
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

Publicidad

Re: Consulta por expresión regular

Notapor teofederico » 2011-06-07 10:09 @465

BORRADO por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:19 @680, editado 1 vez en total
teofederico
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-06-06 10:53 @495

Re: Consulta por expresión regular

Notapor teofederico » 2011-06-07 10:18 @471

BORRADO por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:19 @679, editado 1 vez en total
teofederico
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-06-06 10:53 @495

Re: Consulta por expresión regular

Notapor ileiva » 2011-06-07 11:07 @505

Si siempre tendrán el mismo formato, puedes aprovechar que sabes cuál es la última <div> contenida dentro de la que quieres. Esto me funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. m{<div class="classified-summary">(.*?<span class="price-list">.*?<\/span>)\s+<\/div>}gs
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

No es muy bonito que digamos, pero funciona.

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

Re: Consulta por expresión regular

Notapor teofederico » 2011-06-07 12:04 @544

Borrado por incumplir las normas del sitio.
Última edición por teofederico el 2011-06-07 15:18 @679, editado 2 veces en total
teofederico
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-06-06 10:53 @495

Re: Consulta por expresión regular

Notapor explorer » 2011-06-07 14:07 @630

Tienes un problema, teofederico.

Según la licencia legal de este sitio, en la cláusula 3 (CONDUCTA), dice, refiriéndose al usuario que accede a la web:

«No utilizar medios automáticos, con inclusión de arañas, robots, rastreadores, herramientas de ataque a datos, o similares para descargar información del Servicio, salvo los motores de búsqueda de Internet (por ejemplo, Google) y archivos públicos no comerciales (por ejemplo, archive.org) que cumplen con nuestro archivo robots.txt;»

Eso quiere decir que no podemos ayudarte para extraer información de esta web, pues estaríamos violando esa licencia.
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: Consulta por expresión regular

Notapor teofederico » 2011-06-07 14:34 @648

Entiendo perfectamente.

Gracias de todas forma por su ayuda, les repito que yo hacía años no tocaba esto y nada, me estoy poniendo de nuevo, había hecho algo similar, pero para detectar insultos y otras cosas en la publicaciones que hacían en una web.

Lamento haberlos envuelto en esto.

Saludos.
teofederico
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-06-06 10:53 @495

Re: Consulta por expresión regular

Notapor explorer » 2011-06-07 15:39 @693

Bueno, el truco consiste en "no-dar-muchas-pistas" de qué es lo que queremos hacer... ;) ;) ;)

No quitaré el hilo, pero sí esconderé el enlace a la web inicial.

Esta es mi solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;               # somos modernos
  3. use utf8;                       # este programa está escrito en utf8
  4. use autodie;                    # es mejor morir que regresar con deshonor (proverbio Klingon)
  5. use open qw':utf8 :std';        # la entrada y la salida es en formato utf8
  6. use Encode 'decode_utf8';       # la web también está en utf8
  7. use LWP::Simple;
  8.  
  9. ## Obtenemos la página
  10. my $web = get('http://www.inxxxxxxxxxxxxxxxtina.com.ar/casas-en-venta-174');
  11.  
  12. die "ERROR: No pude obtener la página web" if not $web;
  13.  
  14. my $página = decode_utf8($web);                         # lo pasamos de utf8 a caracteres
  15.  
  16.  
  17. ## Obtenemos la sección principal
  18. my($contenido) = $página =~ m{<div class = 'list-right' id='listFilter'>\s+(.+?)\s+<div id="slot_bottom"}s;
  19.  
  20.  
  21. ## Leemos el $contenido, dividiendo por partes
  22. $/ = q(<div class="classified-summary">);
  23.  
  24. open my $CASAS, q[<:utf8], \$contenido;
  25.  
  26. while (<$CASAS>) {              
  27.  
  28.     if (
  29.         m{            
  30.                 <h2><a[ ]href=" (?<URL>.+?) "> (?<título>.+?) <
  31.                 .+?
  32.                 <p> \s* (?<descripción>.+?) \s* <
  33.                 .+?
  34.                 class='d'> \s* (?<fecha>.+?) <
  35.                 .+?
  36.                 <a .+? > (?<categoría>.+?) <
  37.                 .+?
  38.                 class="price-list"> \s* (?<precio>.+?) \s* <
  39.         }sx
  40.     ) {
  41.         say "URL:         [$+{URL}]";
  42.         say "Título:      [$+{título}]";
  43.         say "Descripción: [$+{descripción}]";
  44.         say "Fecha:       [$+{fecha}]";
  45.         say "Categoría:   [$+{categoría}]";
  46.         say "Precio:      [$+{precio}]";
  47.         say '';
  48.     }
  49. }
  50.  
  51. close   $CASAS;
  52.  
  53. __END__
  54. URL:         [/cordoba/casas-en-venta/a-vender-casa-4-dormit-de-categoria-en-obra-country-la-paloma/509471]
  55. Título:      [A VENDER CASA 4 dormit. de CATEGORIA en OBRA - COUNTRY LA PALOMA]
  56. Descripción: [ESPECTACULAR CASA de CATEGORIA 4 dormit. en OBRA GRUESA - en Barrio Country LA PALOMA
  57. de 270 mts.2 proyectados en plano aprobado, 220 mts.2 construidos (cimientos, paredes y  techo), sobre un  terreno de 1250 mts.2, ...]
  58. Fecha:       [06/06 16:22]
  59. Categoría:   [Córdoba - Casas en venta]
  60. Precio:      [$ 0,00]
  61.  
  62. URL:         [/santa-fe/casas-en-venta/casa-2-dormitorios-a-estrenar-pueblo-esther/353613]
  63. Título:      [CASA 2 DORMITORIOS A ESTRENAR - PUEBLO ESTHER-]
  64. Descripción: [Barrio Cerrado SOL PARANA. Ubicado sobre la Ruta AO12, a 2km de la Autopista Rosario-Buenos  Aires. Dúplex a estrenar en dos plantas. Luminosa. Estar-comedor. Cocina semiseparada. Toilette. En P.A.: 2 dorm con placard...]
  65. Fecha:       [06/06 16:02]
  66. Categoría:   [Santa Fe - Casas en venta]
  67. Precio:      [U$S 170.000,00]
  68.  
  69. URL:         [/santa-fe/casas-en-venta/departamentos-1-2-y-3-dormitorios-lofts-a-estrenar-rosario/330316]
  70. Título:      [Departamentos: 1, 2 y 3 Dormitorios. LOFTS. A estrenar. ROSARIO.]
  71. Descripción: [Semipisos y Pisos Exclusivos. 1 y 2 Dormitorios.
  72. Pisos Exclusivos 2 y 3  Dormitorios. Lofts. Vista al Rio. Quincho. Pileta.
  73. Opción 2 cocheras por  unidad. Excelentes detalles, calidad de construcción y terminación...]
  74. Fecha:       [06/06 16:02]
  75. Categoría:   [Santa Fe - Casas en venta]
  76. Precio:      [U$S 69.000,00]
  77.  
  78.  
Coloreado en 0.007 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Consulta por expresión regular

Notapor teofederico » 2011-06-07 15:53 @703

Bueno, estoy impresionado... gracias :)

Me has cambiado todo ¡ja,jamja! por dios, qué desastre que soy...

Voy a intentar reproducir el código.

Tuve que quitar la librería Moderno Perl.

Recibí el resultado
Malformed UTF-8 character (unexpected non-continuation byte 0x67, immediately after start byte 0xe1) at C:\ProyectosPerl\Props\base.pl line 201.
Malformed UTF-8 character (unexpected non-continuation byte 0x74, immediately after start byte 0xed) at C:\ProyectosPerl\Props\base.pl line 210.
Malformed UTF-8 character (unexpected non-continuation byte 0x6e, immediately after start byte 0xf3) at C:\ProyectosPerl\Props\base.pl line 210.
Malformed UTF-8 character (unexpected non-continuation byte 0x61, immediately after start byte 0xed) at C:\ProyectosPerl\Props\base.pl line 210.
Sequence (?<... not terminated in regex; marked by <-- HERE in m/<h2><a[ ]href=" (?<URL>.+?) "> (?<t <-- HERE / at C:\ProyectosPerl\Props\base.pl line 210.


También uní todo (para probar).

Sintáxis: [ Descargar ] [ Ocultar ]
  1. while (<$CASAS>) {        
  2.    if ( m{<h2><a[ ]href=" (?<URL>.+?) "> (?<título>.+?) <.+?<p> \s* (?<descripción>.+?) \s* <.+?class='d'> \s* (?<fecha>.+?) <.+?<a .+? > (?<categoría>.+?) <.+?class="price-list"> \s* (?<precio>.+?) \s* <}sx ) { 
  3.     say "URL:     [$+{URL}]"; 
  4.     say "Título:   [$+{título}]"; 
  5.     say "Descripción: [$+{descripción}]"; 
  6.     say "Fecha:    [$+{fecha}]"; 
  7.     say "Categoría:  [$+{categoría}]"; 
  8.     say "Precio:   [$+{precio}]"; 
  9.     say ''; 
  10.   } 


Voy a seguir probando de está manera...
teofederico
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2011-06-06 10:53 @495

Re: Consulta por expresión regular

Notapor explorer » 2011-06-07 17:25 @767

Claro que salen errores... :) si quitas módulos, es muy posible que salgan errores :D

Instalar módulos, en Perl, es bastante sencillo... No lleva mucho tiempo. Y algunos ahorran mucho trabajo. Fíjate que el programa se queda corto.

Lo que sí tiene que quedar claro, es que estamos en el foro Intermedio, así que, yo aquí, uso técnicas avanzadas (bueno, no demasiadas; no es el foro Avanzado :twisted: )

La expresión regular se puede escribir así, con espacios y separada en líneas, gracias a la opción /x.

Una cosa que a lo mejor no te funciona, son las capturas con nombre: (?<nombre>...), que sólo funcionan a partir de Perl v5.10.

El módulo Modern::Perl activa varias opciones. Una de ellas es la

use feature ':5.10';

que activa las opciones nuevas de Perl v5.10; entre ellas, la sentencia say().

Y, bueno, usar utf8 te permite usar caracteres acentuados en los nombres de las variables. Por eso, puedo poner $página, en lugar de $pagina.

Un detalle importante... yo he creado mi programa en un entorno utf8 (en mi Linux). El "use open qw(:utf8 :std);" indica que la entrada estándar del programa (que no usamos) y la salida estándar (que sí usamos con el say()) deben salir los caracteres en esa codificación.

Necesitamos el módulo Encode porque la página que descargamos viene en esa codificación.

(Bueno, ahora que lo pienso, quizás no haga falta la línea 14, ya que en la 24 ya indicamos que el $contenido está en utf8. Edito: confirmado: el módulo Encode se puede ahorrar.)

El truco está en la línea 22. La variable $/ es el delimitador de los registros de entrada. Ahí podemos decir qué separan a unos registros de otros. En este caso, ponemos el comienzo de <div>, por lo que Perl se encargará de darnos las entradas, partiendo el $contenido por ese valor.

La línea 24, para mí, es un hito: es la primera vez que "abro" una variable escalar como si fuera un fichero (con open()). Lo aprendí hace poco, y en algunas situaciones, como esta, es muy útil.

La expresión regular de la línea 29 separa los componentes con espacios en blanco y en líneas separadas, gracias a /x como he dicho antes. Por eso, en la primera línea de la exp. reg. hay un "[ ]" porque ese espacio sí que es significativo para el patrón (no separa partes del patrón, sino que forma parte del propio patrón, de lo que estamos buscando). El resto de la exp. reg. no tiene misterio: siempre usamos .+? para buscar y/o capturar.

De hecho... he complicado demasiado el programa... :)

Se puede reducir a esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use LWP::Simple;
  3.  
  4. my $web = get('http://www.inmuxxxxxxxtina.com.ar/casas-en-venta-174');
  5.  
  6. while ($web =~ m{<h2><a href="(.+?)">(.+?)<.+?<p>\s*(.+?)\s*<.+?class='d'>\s*(.+?)<.+?<a.+?>(.+?)<.+?class="price-list">\s*(.+?)\s*<}gs) {
  7.     print "URL:         [$1]\n";
  8.     print "Título:      [$2]\n";
  9.     print "Descripción: [$3]\n";
  10.     print "Fecha:       [$4]\n";
  11.     print "Categoría:   [$5]\n";
  12.     print "Precio:      [$6]\n\n";
  13. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Bueno, al menos hemos aprendido cosas nuevas.
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

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

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