[Moscow.pm] Работа с Web::Scraper

Foxcool foxcool333 на gmail.com
Ср Ноя 9 04:56:03 PST 2011


On 11/09/2011 03:39 PM, Orlovsky Alexander wrote:
> 09.11.2011, 13:36, "Foxcool"<foxcool333 на gmail.com>:
>> Заранее извиняюсь, возможно, за тривиальные вопросы, т.к. я из редкого
>> нынче вида Перл-джуниоров.
> ) нормальные вопросы, но лучше когда еще в вопросе есть примеры кода и входных данных
>
>> Есть интересный модуль Web::Scraper, документацию которого я не нахожу
>> избыточной, т.к. не могу разобраться, как его "натравливать" на теги.
> Да, интересный фетчер, как и все штуки которые фигачит Tatsuhiko.
>
>> Есть некая страница, которая полна таблиц, идущих друг за другом, разных
>> и т.д. Первая проблема, с которой я столкнулся: мне нужны определенные
>> таблицы. И не с определенным id или class, а с значением другого атрибута.
>>
>> <tablewidth="100%"cellspacing="0"cellpadding="3"border="0">
>> <tablewidth="100%"cellspacing="2"cellpadding="1">
>>
>> Например, cellspacing="2", или cellpadding="1", или даже оба. Как мне
>> указать это скраперу? Кстати, посоветуете другой инструмент, буду
>> непротив.
> Да, документации немного. Отсюда вывод – надо смотреть код и тесты:
> https://metacpan.org/source/MIYAGAWA/Web-Scraper-0.35/lib/Web/Scraper.pm
> https://metacpan.org/source/MIYAGAWA/Web-Scraper-0.35/t
> Это еще и полезно для общего развития (если что-то не понятно в коде, то это повод разобраться или хотя бы попробовать это сделать)
>
> Я вот их немного не без удовольствия покурил
> и родил код, который смотри в конце письма.
> Кстати, больше всего мучений доставило вспоминать xpath :)
>
>> С небольшим модулем, который парсит регулярками разобрался
>> быстро и доволен его работой, но хотелось бы разобраться с каким-нибудь
>> большим и стабильным инструментом для того, чтобы использовать его в
>> чрезмерно важных задачах.
> Э-ка завернул!
> Если инструмент полностью  устраивает и нет причин его менять – лучше освоить какую-то смежную предметную область или перпендикулярную (модно говорить "ортогональную", кстати, запомни может пригодиться! :) а не гнаться за совершенством.
>
> Собственно код:
>
> use v5.12;
> use Data::Dumper;
> use Web::Scraper;
>
> my $tables_cnt = scraper {
>      process "table", 'tables[]' =>  'raw';
>      process '//table[contains(@cellspacing, "2")', 'tables_with_cs2[]' =>  'raw';
>      process 'table[cellspacing]', 'tables_filtered[]' =>  scraper {
>          process q{table}, raw =>  'raw';
>          process q{table}, cellpadding =>  q{@cellpadding};
>      };
>      process 'table[cellspacing]', 'tables_handmade_filter[]' =>  sub {
>          my $node = shift; # HTML::Element
>          my $cs = $node->attr('cellspacing');
>          say "CS=>$cs";
>          return unless $cs =~ /^0|2$/;
>          return {
>              as_text =>  $node->as_text(),
>              cellpadding =>  $node->attr('cellpadding'),
>              cellspacing =>  $cs,
>          };
>      };
> };
>
> my $html;
> my $fh = *DATA;
> { local $/ = undef; $html =<$fh>; }
>
> my $res = $tables_cnt->scrape(\$html);
> say Dumper($res);
>
> __DATA__
> <html><body>
> <table width="100%" cellspacing="0" cellpadding="3" border="0">  table1</table>
> <table width="100%" cellspacing="2" cellpadding="1">  table2</table>
> <table width="100%" cellspacing="3" cellpadding="1">  table3</table>
> <table width="100%" cellpadding="1">  table3</table>
> </body></html>
>
>
>
Огромное спасибо! Вообще я много сидел, пробовал, мучился. Смотрел на 
тесты немного. Сейчас разбираюсь с CSS-селекторами 
http://mojolicio.us/perldoc/Mojo/DOM/CSS#E5Bfoo3D22bar225D , ну и 
конечно присмотрюсь повнимательнее к XPath. Ваш пример очень погом и 
раскрыл этот способ! (:


Подробная информация о списке рассылки Moscow-pm