Извлечение информации из HTML с использованием wget и Perl - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь написать сценарий Perl, который работает как телепрограмма, которая отображает текущее шоу, воспроизводимое для определенных каналов, например Fox (7.1 WSVNH) и ABC (10.1 WPLGH).

ВыводЯ пытаюсь добиться, чтобы это выглядело так:

7.1 - Hell's Kitchen

10.1 - 20/20

... and so on

(номер канала и название текущего шоу)

Вот сайт, из которого я пытаюсь извлечь HTML: https://nocable.org/tv-listings/2f46-miami-fl

Вот команда, которую я использую для выполнения скрипта:

wget -O - website | ./script.pl

А вот код, над которым я работаю (Примечание: я пытаюсь придерживаться использования регулярных выражений вPerl для сопоставления с образцом, так как я все еще изучаю Perl):

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

Я могу извлечь куски HTML, но не то, что мне нужно.Я пытаюсь извлечь название шоу.Также я подумал, что лучше всего хранить заголовки шоу в хэше после извлечения из html.

%channel; 
$channel{'7.1'} = $showtitle;
$channel{'10.1'} = $showtitle;

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Зачем изобретать велосипед?Используйте XMLTV , который может уже поддерживать источник информации о вашей программе.Если нет, то почему бы не использовать фреймворк и добавить новый граббер для вашего источника ?

Посмотрите на другие грабберы и, например, используйте HTML :: TreeBuilder для анализа HTMLв ДОМ.Поиск информации в DOM намного проще и менее подвержен ошибкам при изменении некоторых частей HTML.

0 голосов
/ 08 декабря 2018

Перво-наперво: обработка HTML с использованием регулярных выражений - плохая идея.Они неадекватны для работы в принципе и сталкиваются с проблемами на практике.Об этом много написано.

Я понимаю, что вы "только" хотите подобрать заголовки, но у вас в руках полноформатный HTML-документ.Проблемы будут накапливаться, дела будут ухудшаться, и этому не будет конца.

Вместо этого, существует множество модулей, которые могут выполнять для вас анализ различных типов контента.Что касается таблиц, то, что вам нужно, HTML :: TableExtract , в частности, является отличным инструментом.

HTML-документ также может быть легко найден в вашем скрипте с помощью ряда хороших модулей.,Я использую LWP :: Simple ниже, но см., Например, полную структуру LWP :: UserAgent и Mojo .

Для простотыЯ выбираю первую таблицу в документе (которая оказывается правильной) и выполняю только базовую обработку для демонстрации.Я надеюсь, что вы можете взять его оттуда.

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;
 }

Обратите внимание на операторы очистки undef, пробела и перехода на новую строку, где arrayref для каждой строки «распаковывается» в массив.Есть и другие способы сделать это, но я оставил это необработанным, чтобы показать, как это происходит, когда вам нужно войти в детали HTML с помощью регулярного выражения.

Я заменяю неопределенные элементы пустыми строками на случай, если вы хотите отформатировать таблицу ивыровнять его элементы для печати.Я добавляю | между элементами для облегчения просмотра.Пожалуйста, подстраивайтесь под свои нужды.

Первые несколько строк, также обрезанные для удобства чтения

All | 11:00 pm (ON AIR) | 11:30 pm | 12:00 am | 12:30 am | 1:00 am       ...
WPBT2HD 2.1 | Celtic Woman: Ancient Land 11:00 pm |  |  |  | Retire Safe ...
WPBT2-2 2.2 | Globe Trekker Delhi & Agra10:30 pm | Lidia's Kitchen       ... 
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...