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

Javier Arturo Rodriguez codehead a gmail.com
dij nov 21 01:55:30 PST 2013


*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



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