[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