3 votes

Extraire des informations d'une page web en utilisant wget et Perl script.

Le but de ce script Perl est de tirer des informations d'une page web en utilisant wget et Perl. Dans ce cas, voici le site web dont j'essaie d'extraire des informations : https://nocable.org/tv-listings/bm95-pomona-ca-91768

Je veux seulement que le titre s'affiche. Par exemple,

2.1 - The Ellen Degeneress Show
4.1 - NBC News
7.1 - Hell's Kitchen

Et c'est tout.

C'est ce que j'ai fait jusqu'à présent, mais je ne sais pas si je m'y prends bien ou mal. Quelqu'un peut-il aider ou donner une sorte de conseil sur ce qu'il faut faire pour afficher juste le canal 2.1, 4.1 et 7.1 avec le titre seulement ? Plus précisément avec wget et Perl script. Toute réponse est appréciée, car je suis encore en train d'apprendre sur Perl.


use warnings;
use strict;
use feature 'say';

use LWP::Simple;
use HTML::TableExtract;

use open qw(:encoding(UTF-8) :std);

my $url = ' https://nocable.org/tv-listings/bm95-pomona-ca-91768';
my $page = get($url) or die "Can't load $url: $!";

my $tec = HTML::TableExtract->new();
$tec->parse($page);

foreach my $rowref ($tec->rows) 
{
    next if not @$rowref;

    # Clean up undefined/whitespace/newlines, often found in HTML
    my @row = map { 
        $_ = '' if not defined;  # keep undefined fields for formatting
        s/^\s*|\s*$//g;          #/ leading and trailing whitespace
        s/\s+|\n/ /g;            # multiple spaces, newlines
        $_                       # return it
    } @$rowref;

    say join ' | ', @row;
 }

0voto

Dave Cross Points 17363

Votre principal problème semble être que vous regardez le mauvais tableau. Il y a plusieurs tableaux sur cette page et vous pouvez utiliser la fonction attribs lors de la création de votre objet parser afin de retourner celui qui vous intéresse.

my $tec = HTML::TableExtract->new(attribs => {id => 'programming_data' });

Après avoir ajouté cela, votre code imprimera les informations pour tous les canaux. Vous devez ensuite créer un moyen d'identifier les chaînes qui vous intéressent. J'ai utilisé un regex :

my @channels = qw(2.1 4.1 7.1);
my $channel_re = '\b(' . join('|', map { quotemeta } @channels) . ')\b';

Et dans la boucle principale, vous pouvez sauter les chaînes qui ne vous intéressent pas :

next unless $rowref->[0] =~ /$channel_re/;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X