WWW :: Mechanize перейти по ссылке не могу найти ссылку

У меня есть набор файлов HTML, которые используются в качестве интерфейса для доступа к некоторым файлам на сервере. Есть главная страница, которая ссылается на различные страницы отчетов, которые затем содержат ссылки на файлы. Я пытаюсь получить связанные файлы на каждой странице и определить, обновлены ли они. Тем не менее, я делаю это шаг за шагом, и я хочу сначала разобраться с этой частью.

Для справки структура папок такая:

//server/
|---pages/
|---+---MainPage.htm
|---+---reports/
|---+---+---Report1.htm
|---+---+---Report2.htm

Метод find_all_links() получает нужные мне ссылки. Однако, когда я пытаюсь передать URL-адреса результирующих объектов WWW :: Mechanize :: Link в follow_link(), он говорит, что файл не существует. Файл ДЕЙСТВИТЕЛЬНО существует, но не там, где он думает, что он существует. Как ни странно, переход по ссылке вручную в браузере работает нормально.

Ниже приведен мой код для решения этой проблемы.

use strict;
use warnings;
use WWW::Mechanize;

my $dir = '//server/pages';
chdir($dir);

my $mech = WWW::Mechanize->new();
$mech->get("file:$dir/MainPage.htm");

my @links = $mech->find_all_links(url_regex => qr/^\/reports\/.*/i);

foreach my $link (@links){
    print $link->url(), "\n";
    $mech->follow_link(url => $link->url());
    # Get all links on this page and check the modified dates
    ...
    $mech->back();
}

Он производит следующий вывод:

/reports/Report1.htm
Error GETing file://server/reports/Report1.htm: File `\\server\reports\Report1.htm` does not exist at script.pl line 15.

Путь к файлу, который он использует, неверен, и поэтому он не может найти файл. Как мне заставить его использовать правильный путь? Я также пробовал url_abs() вместо url(). Мы будем благодарны за любую помощь, руководство и / или понимание. Большое спасибо!


person Alex A.    schedule 24.12.2013    source источник
comment
Измените свои ссылки, чтобы использовать абсолютные пути, например <a href="file://path/to/resource">...</a>.   -  person ThisSuitIsBlackNot    schedule 25.12.2013
comment
@ThisSuitIsBlackNot: К сожалению, я ничего не могу контролировать в отношении HTML. Я могу обрабатывать только существующий HTML в моем коде.   -  person Alex A.    schedule 25.12.2013


Ответы (1)


Вам нужно добавить $dir к своему URL-адресу. Вместо использования follow_link(), который не позволяет указать URL-адрес, просто используйте другой get():

$mech->get( "file:$dir/" . $link->url() );
person ThisSuitIsBlackNot    schedule 24.12.2013
comment
Это прекрасно работает. Я все еще не понимаю, почему follow_link() не ссылается на правильный абсолютный путь, но я в порядке, просто не думаю об этом. Большое спасибо! - person Alex A.; 25.12.2013
comment
@Alex follow_link() просто вызывает $self->get( $link->url );, где $link->url в вашем случае /reports/Report1.htm. - person ThisSuitIsBlackNot; 25.12.2013
comment
Спасибо за разъяснение, это помогает мне немного лучше понять это. Большое спасибо за Вашу помощь! - person Alex A.; 30.12.2013