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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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