使用wget和Perl从HTML提取信息

Dig*_*ger 0 linux perl debian

我正在尝试编写一个类似于电视指南的Perl脚本,该脚本显示某些频道(例如Fox(7.1 WSVNH)和ABC(10.1 WPLGH))正在播放的当前节目。

我正在尝试实现的输出如下所示:

7.1 - Hell's Kitchen

10.1 - 20/20

... and so on
Run Code Online (Sandbox Code Playgroud)

(频道号和当前节目标题)

这是我要从中提取HTML的网站:https : //nocable.org/tv-listings/2f46-miami-fl

这是我用来执行脚本的命令:

wget -O - website | ./script.pl
Run Code Online (Sandbox Code Playgroud)

这是我正在处理的一些代码(注意:由于我仍在学习Perl,因此我试图在Perl中坚持使用正则表达式进行模式匹配):

#!/usr/bin/perl
while ( <> ) {
    @htmlstring = m/wplgh(.*?)br/i
}
print @htmlstring;
Run Code Online (Sandbox Code Playgroud)

我能够提取html块,但不能提取我想要的块。我正在尝试提取节目标题。另外我一直在想,最好是从html中提取出来后,将显示标题存储在哈希中。

%channel; 
$channel{'7.1'} = $showtitle;
$channel{'10.1'} = $showtitle;
Run Code Online (Sandbox Code Playgroud)

zdi*_*dim 5

首先,使用正则表达式处理HTML是一个坏主意。他们原则上不足以胜任工作,而在实践中却遇到麻烦。关于这一点已经写了很多。

我了解到您“仅”希望选择标题,但是您手上有一份完整的HTML文档。问题将不断蔓延,情况将变得更糟,并且这将没有止境。

相反,有许多模块可以为您解析各种类型的内容。对于表,您需要的是HTML :: TableExtract,这是一个非常出色的工具。

还可以通过许多优质的模块轻松地在脚本中检索HTML文档。我在下面使用LWP :: Simple,但是请参见完整的LWP :: UserAgentMojo框架。

为简单起见,我获取文档中的第一个表(恰好是正确的表),并且仅对演示进行基本处理。我希望您可以从那里拿走它。

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/2f46-miami-fl';
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;
 }
Run Code Online (Sandbox Code Playgroud)

请注意undef,空格和换行符清洁语句,其中每行的arrayref被“解包”为数组。还有其他方法可以做到这一点,但是我不得不保留它的原始内容,以显示一旦必须使用regex来了解HTML详细信息时它如何进行。

我想将未定义的元素更改为空字符串,以备格式化表格并对齐其元素以进行打印。我|在元素之间添加以方便查看。请根据您的需要进行调整。

前几行,也出于可读性而中断

全部| 11:00 pm(空中)| 晚上11:30 | 上午12:00 | 上午12:30 | 凌晨1:00 ...
WPBT2HD 2.1 | 凯尔特女人:古代土地11:00 pm | | | | 退休安全...
WPBT2-2 2.2 | Globe Trekker Delhi&Agra10:30 pm | 莉迪亚的厨房...
...