Как обработать простой цикл в Perl’s WWW ::Mechanize?

#perl #parsing #dom #mechanize

#perl #синтаксический анализ #dom #механизировать

Вопрос:

Особенно интересным для меня как для новичка в PHP / Perl является этот сайт в Швейцарии: смотрите это link:http://www.edi.admin.ch/esv/00475/00698/index.html?lang=deamp;webgrab_path=http://esv2000.edi.admin.ch/d/entry.asp?Id= 1308 , который содержит набор данных из 2700 оснований. Все данные доступны для свободного использования без каких-либо ограничений авторских прав на них.

что мы имеем на данный момент: Что ж, задача сбора данных не должна быть проблемой, если я использую WWW ::Mechanize — особенно для выполнения поиска на основе формы и выбора отдельных записей. Хм — я предполагаю, что алгоритм будет состоять в основном из двух вложенных циклов: внешний цикл выполняет поиск на основе формы, внутренний цикл обрабатывает результаты поиска.

Внешний цикл будет использовать функции select() и submit_form() во второй форме поиска на странице. Можем ли мы использовать обработку DOM здесь. Хорошо — как мы можем получить значения выборки.

Во внутреннем цикле по результатам будет использоваться функция follow link, чтобы перейти к фактическим записям с помощью следующего вызова.

 $mech->follow_link(url_regex => qr/webgrab_path=http://evs2000.*?
Id=d $/, n => $result_nbr);
  

Это перенаправит наш механический браузер на страницу ввода. В основном URL-запрос ищет ссылки, которые имеют шаблон webgrap_path к идентификатору, который уникален для каждой записи базы данных. Переменная $result_nbr сообщает mecha, за каким из результатов он должен следовать следующим.

Если у нас есть несколько страниц результатов, мы также использовали бы тот же трюк для обхода страниц результатов. Для семантического извлечения информации о входе мы могли бы проанализировать содержимое фактических записей с помощью HTML-анализатора XML: LibXML (который отлично работает на этой странице), потому что он предоставляет вам несколько мощных методов выбора DOM (с использованием XPath). Ну, фактический цикл по страницам должен быть выполним в нескольких строках perl макс. 20 строк — вероятно, меньше.

Но подождите: обработка входных страниц тогда будет самой сложной частью скрипта.

Подходы: В принципе, мы могли бы выполнить тот же алгоритм с одним циклом while, если будем разумно использовать функцию back().

Можете ли вы дать мне подсказку для начала — обработка входных страниц — как это делается в Perl :: Mechanize

Ответ №1:

«Который имеет набор данных из 2700 оснований. Все данные можно свободно использовать без каких-либо ограничений авторских прав на них.»

Неверно. Смотрите http://perlmonks.org/?node_id=905767

«Данные защищены авторским правом, даже если они доступны свободно: «Загрузка или копирование текстов, иллюстраций, фотографий или любых других данных не влечет за собой никакой передачи прав на контент». (и снова, на немецком, поскольку ранее вы очищали какой-то другой немецкий список от спама).»