2008-10-21 2 views
3

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

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

ответ

11

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

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

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

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

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

+0

Также см. [http://datenzoo.de/pub/gpw2008/web-scraper/web-scraper-talk.html], который является моим немецким разговором о Web :: Sc Raper. Автоматический перевод: [http://66.196.80.202/babelfish/translate_url_content?.intl=de&lp=de_en&trurl=http%3A%2F%2Fdatenzoo.de%2Fpub%2Fgpw2008%2Fweb-scraper%2Fweb-scraper-talk.html] – Corion 2008-10-21 08:11:11

3

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

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

  1. Разбор кода уже написаны для вас (только use XMLTV;).
  2. Вы не будете нарушать условия обслуживания Yahoo.
  3. Вам не придется иметь дело с Yahoo, активно пытающимся сломать ваш скрипт. (Они не любят автоматические сценарии, снимающие списки ТВ-каналов, см. № 2.)
1

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

1

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 

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

Смежные вопросы