[bcn-pm] RS: RS: RS: RS: Consulta sobre parsejar

Agud Pique, Enric eagud.q a tv3.cat
dij nov 21 03:07:51 PST 2013


Rosetta Code? jeje, que quieres decir, que es largo y raro?

Gracias por tus ejemplos,  y como guardarias los datos que aparecen al hacer print Dumper(\%arr);, en un fichero plano (dat,..csv) con un formato como el siguiente...


Estacio               Qualitat     Gruix Minim   Gruix Maxim   KM MARCATS

Tuixent-la-Vansa      Pols         15 cm          50 cm        20 km


Enric

si mejoro el codigo en R tambien os lo paso...

Ciao


-----Missatge original-----
De: Barcelona-pm en nom de Javier Arturo Rodriguez
Enviat el: dj. 21/11/2013 10:55
Per a: Barcelona Perl Mongers
Tema: Re: [bcn-pm] RS:  RS:  RS: Consulta sobre parsejar
 
*wow!* Nunca había visto R usado así... esto es digno de un Rosetta Code!

En Perl, mi primera opción sería siempre pQuery:

--8<--cut-here--8<--
#!/usr/bin/env perl
use strict;
use utf8::all;
use Data::Dumper;
use pQuery;

my @arr;
pQuery('http://www.tuixent-lavansa.com/pagina/inicial')
    ->find('table td b')
    ->each(sub{
        push @arr,pQuery($_)->text unless $_->{colspan}
    });
my %arr = @arr;
print Dumper(\%arr);
--8<--cut-here--8<--

$VAR1 = {
          'KM MARCATS' => '20 Km',
          "GRUIX M\x{fffd}XIM" => '50 cm',
          'OBERT' => "ESTACI\x{fffd}",
          'D\'HIVERN' => 'RESTAURANT L\'ARP',
          'OBERT CAPS DE SETMANA' => 'ESTAT DE LA NEU',
          "ESTAT DE L'ESTACI\x{fffd}" => "ACC\x{fffd}S",
          "GRUIX MIN\x{fffd}M" => '15 cm',
          'QUALITAT' => 'Pols',
          'REFUGI DE L\'ARP' => 'RESTAURANT COLL DE PORT'
        };

El problema con pQuery es que el HTML mal formado lo lleva muy mal. Y
siendo realistas esta es la norma en Internet. Este mismo documento
tiene lo suyo: dos tablas con el mismo ID (anidadas, para liarla otro
poco), <TD>s sin tags de cierre, etcétera. Sólo hecho de menos el <blink>.

Otra alternativa es Mojo::UserAgent. Seguro que Diego podría hacer un
one-liner de memoria y con los ojos cerrados. Por mi parte, lo mejor que
puedo hacer es esto:

--8<--cut-here--8<--
#!/usr/bin/env perl
use strict;
use utf8::all;
use Data::Dumper;
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;

my @arr;
$ua->get('http://www.tuixent-lavansa.com/pagina/inicial')
    ->res
    ->dom('td b')
    ->each(sub{
        push @arr,shift->text
    });
my %arr = @arr;
print Dumper(\%arr);
--8<--cut-here--8<--

$VAR1 = {
          'OBERT' => '    ESTACIÓ',
          'ESTAT DE L\'ESTACIÓ    ' => '    ACCÉS',
          '    GRUIX MINÍM' => '15 cm',
          'D\'HIVERN' => 'RESTAURANT L\'ARP',
          'OBERT CAPS DE SETMANA' => 'ESTAT DE LA NEU    ',
          '    QUALITAT' => 'Pols',
          '    GRUIX MÀXIM' => '50 cm',
          '    KM MARCATS' => '20 Km',
          'REFUGI DE L\'ARP' => 'RESTAURANT COLL DE PORT'
        };

Como se observa, MUA no se "come" el whitespace, pero según a quién se
le pregunte esto no es un bug, sino un feature.

(Por supuesto, en ambos ejemplos es posible jugar con los selectores
para obtener con más precisión la información que se desea obtener. Esto
se deja como ejercicio para el lector.)

Salud... y Perl!

-Javier Arturo Rodríguez

_______________________________________________
llista dels Barcelona-pm
Barcelona-pm a pm.org
http://mail.pm.org/mailman/listinfo/barcelona-pm
BCN Perl Mongers: http://barcelona.pm.org



Més informació sobre la llista de correu Barcelona-pm