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

Orlovsky Alexander nordicdyno на yandex.ru
Ср Ноя 9 03:39:01 PST 2011


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>





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