Как я могу извлечь XML из веб-сайта и сохранить в файл с помощью Perl LWP? - PullRequest
3 голосов
/ 21 октября 2008

Как я могу извлечь информацию с веб-сайта (http://tv.yahoo.com/listings), а затем создать из него XML-файл? Я хочу сохранить его для последующего анализа и отображения информации с помощью JavaScript?

Я довольно новичок в Perl и понятия не имею, как это сделать.

Ответы [ 4 ]

11 голосов
/ 21 октября 2008

Конечно. Самый простой способ - это модуль Web :: Scraper . Он позволяет вам определять объекты скребка, которые состоят из

  1. имена хеш-ключей,
  2. Выражения XPath, которые находят элементы, представляющие интерес,
  3. и код для извлечения битов данных из них.

Объекты Scraper берут URL и возвращают хэш извлеченных данных. Код экстрактора для каждого ключа сам по себе может быть другим объектом скребка, если это необходимо, так что вы можете определить, как очистить повторяющиеся составные элементы страницы: предоставьте XPath для поиска составного элемента во внешнем скребке, а затем предоставьте кучу дополнительных XPath для извлечения. его отдельные биты во внутреннем скребке. Результатом будет автоматически вложенная структура данных.

Короче говоря, вы можете очень элегантно сосать данные со всей страницы в структуру данных Perl. При этом вся мощь XPath + Perl доступна для использования на любой странице. Поскольку страница анализируется с помощью HTML :: TreeBuilder, не имеет значения, насколько она неприятна. Получающиеся в результате скриптовые скрипты намного проще в обслуживании и гораздо более терпимы к незначительным изменениям разметки, чем скребки на основе регулярных выражений.

Плохая новость: пока что его документация почти не существует, поэтому вам придется поиграть с поиском, например, [ miyagawa web :: scraper ], чтобы найти примеры скриптов, опубликованных автором модуля. .

3 голосов
/ 21 октября 2008

В целом LWP :: Simple или WWW :: Mechanize и HTML :: Tree являются хорошими способами извлечения данных из веб-страниц, в этом В конкретном случае (телепередачи) есть гораздо более простой способ:

Использовать XMLTV с данными из Расписание прямое . Существует небольшая плата (20 долларов США в год), но есть свои преимущества:

  1. Код синтаксического анализа уже написан для вас (просто use XMLTV;).
  2. Вы не будете нарушать условия обслуживания Yahoo.
  3. Вам не придется активно общаться с Yahoo, пытаясь сломать ваш скрипт. (Им не нравятся автоматические сценарии, снимающие телепрограммы; см. № 2.)
1 голос
/ 22 октября 2008

tv.yahoo.com не очень семантичен и не очень прост в очистке! Они, может быть, лучшие альтернативы или корма?

Используя pQuery, я могу быстро получить время и шоу ....

use pQuery;
pQuery( 'http://tv.yahoo.com/listings' )
    ->find( '.show' )->each(
        sub {
            my $n = shift;
            my $pQ = pQuery( $_ ); 
            say $pQ->text;
        }
    );

  # => 4:00pm - 6:30pm Local Programming

Чтобы немного подробнее разобраться, вы можете попробовать это ...

use pQuery;
my @tv_progs;
pQuery( 'http://tv.yahoo.com/listings' )
    ->find( 'li div strong' )->each(
        sub {
            my $n = shift;
            my $pQ = pQuery( $_ ); 
            $tv_progs[ $n ]->{ time } = $pQ->text;
        }
    )
    ->end
    ->find( '.showTitle' )->each( 
        sub {
            my $n = shift;
            my $pQ = pQuery( $_ ); 
            $tv_progs[ $n ]->{ name } = $pQ->text;
        }
    );

for my $prog ( @tv_progs ) {
    say $prog->{name} . " @ " . $prog->{time};
}

   # => Local Programming @ 4:00pm - 6:30pm

И чтобы получить канал ....

use pQuery;
pQuery( 'http://tv.yahoo.com/listings' )
->find( '.chhdr a' )->each(
    sub {
        my $n = shift;
        my $pQ = pQuery( $_ ); 
        say $pQ->text;
    }
);

  # => ABC

Однако сопоставление обратного канала с информацией о программе потребует немного работы; -)

1 голос
/ 21 октября 2008

Если вы хотите передать информацию в Javascript, используйте объектную нотацию Javascript (JSON) вместо XML. Существует множество библиотек Perl, таких как JSON :: Any , которые могут справиться с этим за вас.

...