使用 wget 和 Perl 脚本从网页中提取信息

Pull information from webpage using wget and Perl Script

此 Perl 脚本的目的是使用 wget 和 Perl 从网页中提取信息。在这种情况下,这是我试图从中提取信息的网站:https://nocable.org/tv-listings/bm95-pomona-ca-91768

我只想显示标题。例如,

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

就是这样。

这是我目前所做的,但我不确定我这样做是对还是错。任何人都可以帮助或提供一些建议来显示仅带有标题的频道 2.1、4.1 和 7.1 吗?特别是 wget 和 Perl 脚本。感谢您的任何回应,因为我仍在学习 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;
 }

你的主要问题似乎是你看错了table。该页面上有多个 table,您可以在创建解析器对象时使用 attribs 参数,以便 return 您感兴趣的对象。

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

添加之后,您的代码将打印所有频道的信息。然后您需要创建一种方法来识别您感兴趣的频道。我使用了正则表达式:

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

并且在主循环中,您可以跳过您不感兴趣的频道:

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