2009-11-13 3 views
5

У меня есть код:Как загрузить файл с WWW :: Mechanize после отправки формы?

#!/usr/bin/perl 
use strict; 
use WWW::Mechanize; 

my $url = 'http://divxsubtitles.net/page_subtitleinformation.php?ID=111292'; 
my $m = WWW::Mechanize->new(autocheck => 1); 
$m->get($url); 
$m->form_number(2); 
$m->click(); 
my $response = $m->res(); 
print $m->response->headers->as_string; 

Она представляет кнопку загрузки на странице, но я не знаю, как загрузить файл, который отправляется обратно после POST.

Я хочу, чтобы загрузить его с помощью wget, если это возможно. Я думал, что это может быть секретный URL-адрес или что-то в этом роде? Или мне придется загрузить его с помощью LWP непосредственно из потока ответов?

Так как загрузить файл, который находится в этом заголовке?

Спасибо,

Cody Goodman

ответ

0

Ну дело, что бросил меня самым был «mechanize-> form_number» подпрограмма начинается с 1, тогда как типичные программы начинают свой индекс в 0. Если кто-то хочет знать, как заголовки загрузки ответа, или скачать вложение заголовка s, это способ сделать это.

Теперь вот полный код, чтобы сделать то, что я хотел.

#!/usr/bin/perl 
use strict; 
use WWW::Mechanize; 

my $url = 'http://divxsubtitles.net/page_subtitleinformation.php?ID=111292'; 
my $m = WWW::Mechanize->new(autocheck => 1); 
$m->get($url); 
$m->form_number(2); 
$m->click(); 
my $response = $m->res(); 
my $filename = $response->filename; 

if (! open (FOUT, ">$filename")) { 
    die("Could not create file: $!"); 
} 
print(FOUT $m->response->content()); 
close(FOUT); 
+0

, когда я использовал это, чтобы загрузить pdf-файл из 6 страниц, это так, но содержимое было пустым. что пошло не так. – msinfo

+0

ой! $ mech-> save_content ($ filename, binmode => ': raw', decoded_by_headers => 1); это помогло мне – msinfo

1

Я попробовал ваш код и он возвращает стек HTML из которых только http:// ссылки были:

 
    http://www.w3c.org 
    http://ad.z5x.net 
    http://divxsubtitles.net 
    http://feeds2read.net 
    http://ad.z5x.net 
    http://www.google-analytics.com 
    http://cls.assoc-amazon.com 
используя код


    my $content = $m->response->content(); 
    while ($content =~ m{(http://[^/\" \t\n\r]+)}g) { 
     print("$1\n"); 
    } 

Так мои комментарии к вам относятся:
1. добавьте use strict; к вашему коду, вы программируете для отказа, если вы не
2. прочитайте выходной HTML и определите, что делать дальше, вы этого не сделали, и поэтому вы задали неполный вопрос. Если вы, укажите URL-адрес, который вы хотите загрузить, попросите кого-нибудь еще написать вам программу.

Как только вы определили URL-адрес, который хотите загрузить, это просто вопрос его получения, а затем запись содержимого ответа в файл. например


if (! open(FOUT, ">output.bin")) { 
    die("Could not create file: $!"); 
} 
binmode(FOUT); # required for Windows 
print(FOUT $m->response->content()); 
close(FOUT); 
+0

URL-адрес не содержит информацию, чтобы загрузить файл. Файл находится в заголовках в качестве загрузочного вложения. – Codygman

+0

Я подозреваю, что вы можете быть смущены в отношении HTTP .. ни один файл не волшебным образом встроен в заголовки.Возможно, в заголовках было возвращено перенаправление, и в этом случае вы должны распечатать заголовки и извлечь URL-адрес загружаемого файла. –

+0

Хорошо, PP, мне действительно нужно обойтись, чтобы прочитать RFC для http, и я верю вашему праву. Я думал, что «вложение заголовка» означает, что оно было встроено в заголовки. Я пойду дальше и прочитаю заголовки и посмотрю, смогу ли я найти перенаправление. Спасибо за вашу помощь! – Codygman

3

После отправки формы, вы можете использовать:

$ mech-> save_content ($ имя_файла)

выгружает содержимое $ mech-> содержание в $ файла. $ filename будет перезаписан. Умирает, если есть какие-либо ошибки.

Если тип содержимого не начинается с «text /», то содержимое сохраняется в двоичном режиме.

Источник: http://metacpan.org/pod/WWW::Mechanize

+0

Спасибо за этот ответ. Хотя я смотрел прямо на странице CPAN, я пропустил это, и мне пришлось пробираться через множество плохих результатов Google, пока я не нашел ваш. –