Как я могу извлечь 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
Однако сопоставление обратного канала с информацией о программе потребует немного работы; -)