2013-12-24 3 views
0

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

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

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

Метод find_all_links() получает ссылки, которые я хочу. Однако, когда я пытаюсь передать результирующие URL-адреса WWW :: Mechanize :: Link объектов в follow_link(), он говорит, что файл не существует. Файл DOES существует, только не там, где он считает, что он существует. Как ни странно, после ссылки вручную в браузере работает просто отлично.

Ниже приведен мой код для решения этого вопроса.

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(). Любая помощь, руководство и/или понимание будут с благодарностью оценены. Спасибо!

+0

изменить ваши ссылки, чтобы использовать абсолютные пути, например, '...'. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot: К сожалению, у меня нет контроля над чем-либо на стороне HTML-вещей. Я могу обрабатывать только существующий HTML в моем коде. –

ответ

0

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

$mech->get("file:$dir/" . $link->url()); 
+0

Это работает отлично. Я все еще недоумеваю, почему 'follow_link()' не будет ссылаться на правильный абсолютный путь, но я в порядке, просто не думая об этом. Спасибо! –

+1

@Alex 'follow_link()' просто вызывает '$ self-> get ($ link-> url);' где '$ link-> url' в вашем случае'/reports/Report1.htm'. – ThisSuitIsBlackNot

+0

Спасибо за разъяснение, это помогает мне понять это немного лучше. Большое спасибо за Вашу помощь! –

Смежные вопросы