2010-02-15 2 views
2

Есть ли способ в WWW::Mechanize или любой модуль Perl для чтения в файле после доступа к веб-сайту. Например, я нажал кнопку «Получить», и появится файл (.txt), содержащий сообщение. Как я смогу прочитать контент? Ответы очень ценятся. Я работаю над этим целыми днями. Кроме того, я пробовал все возможности. Может ли кто-нибудь помочь? Если вы можете дать мне идею, пожалуйста? :)Как загрузить файл с помощью WWW :: Mechanize или любого модуля Perl?

Вот часть моего кода:

...

my $username = "admin";<br> 
my $password = "12345";<br> 

my $url = "http://...do_gsm_sms.cgi"; 

my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, agent_alias =>$login_agent, cookie_jar => $cookie_jar); 

$mech->credentials($username, $password);<br> 
$mech->get($url); 

$mech->success() or die "Can't fetch the Requested page";<br> 

print "OK! \n"; #This works <br> 

$mech->form_number(1); 

$mech->click() 

;

После этого появится диалоговое окно «Загрузки», поэтому я могу сохранить файл (но я также могу установить по умолчанию его немедленное открытие вместо сохранения). Вопрос в том, как я могу прочитать содержимое этого файла?

..

+0

Вы ... открываете файл и читаете его? –

+0

Да, я буду использовать mech-> click() ,, и откроется файл, содержащий сообщение. Как я могу прочитать содержимое? – Suezy

+0

WWW :: Mechanize имеет способы получить контент без сохранения в файл. Также, если вы просто пытаетесь прочитать файл, проще использовать LWP :: Simple. Трудно сказать, не зная, что вы пытаетесь сделать. – Cfreak

ответ

2

После щелчка (при условии, что делает то, что он должен), возвращаемые данные должны храниться в вашем объекте $ меха. Вы должны иметь возможность получить данные файла с $mech->content(), , возможно, после подтверждения успеха с $mech->status() и типом ответа с $mech->content_type().

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

+0

Спасибо! Я попробовал $ mech-> content(), тип содержимого отображает текст/html. Содержимое по-прежнему отображает html-коды, а не сам текстовый файл. :( – Suezy

+0

@Suezy: тогда ваш клик не делает то, что вы хотите. Возможно, вам нужно будет сделать один из 'click_button (name => 'somename')', 'click_button (number => somenumber)' или 'click_button (value => 'somevalue') 'или изменить номер формы, который вы используете. В какой-то момент вам может понадобиться поделиться некоторыми из html формы, которую вы пытаетесь автоматизировать, чтобы получить более качественные ответы. – ysth

+0

Возможно, у меня просто проблема с нажав кнопку, я не знаю, откроет ли файл вообще. Страница содержит тип «submit» без имени, а не кнопку (а не внутри формы), поэтому я использовал mech-> submit() вместо Content_type по-прежнему показывает коды HTML. Hmm .... что мне не хватает? – Suezy

1

Смею спросить ... вы пробовали это?

my $content = $mech->content(); 
+0

Я пробовал. но отображаемый контент - это коды HTML, а не содержимое загруженного текстового файла. :( – Suezy

+0

Какие именно «коды HTML» вам дают? – pioto

+0

Точно так же, как в «Источнике страницы» – Suezy

3

Я принимаю вы имеете в виду, что веб-сайт отвечает на форме представления, возвращая ответ не-HTML (а «простой текст /» файл, скажем), что вы хотите сохранить.

Я считаю, что вы хотите $mech->save_content($filename)

Добавлено:

Прежде всего, необходимо представить ВСП: форма представления Меха, перед сохранением файла в результате (текст). click для clicking a button, тогда как вы хотите отправить форму, используя $mech->submit() или $mech->submit_form(...).

#!/usr/bin/perl 

use strict; 
use warnings; 

use WWW::Mechanize; 

my $username = "admin"; 
my $password = "12345"; 
my $login_agent = 'WWW::Mechanize login-agent'; 
my $cookie_jar; 

#my $url = "http://localhost/cgi-bin/form_mech.pl"; 
my $url = "http://localhost/form_mech.html"; 

my $mech = WWW::Mechanize->new(autocheck => 1, quiet => 0, 
       agent_alias => $login_agent, cookie_jar => $cookie_jar 
      ); 

$mech->credentials($username, $password); 
$mech->get($url); 

$mech->success() or die "Can't fetch the Requested page"; 

print "OK! \n"; #This works 

$mech->submit_form(
    form_number => 1, 
); 
die "Submit failed" unless $mech->success; 

$mech->save_content('out.txt'); 
+0

Я также пробовал это, но сохраненный контент - это html-коды, а не содержимое загружаемого файла, который я хотел. hmm .. – Suezy

1

Откройте файл (не окно «Загрузки»), как если бы вы были его просмотра в вашем браузере; вы можете сохранить его позже несколькими строками кода.

При условии, у вас есть HTML::TreeBuilder установлен:

my $textFile = $mech->content(format => "text"); 

вы должен получить текст появившегося окна, которое открывается.

Затем откройте дескриптор файла для записи результатов в:

open my $fileHandle, ">", "results.txt"; 
print $fileHandle $textFile; 
close $fileHandle; 
+0

s/он сказал, что он уже загружал .txt-файл (когда это делается через браузер), так что это не поможет. – ysth

+0

@ysth: s/he сказал, что файл можно открыть, если потребуется. Я предполагаю, что текстовый файл откроется в окне браузера. – Zaid

+0

Сообщение откроется как .txt-файл. Когда я нажимаю кнопку (type = submit), для msg появляется диалоговое окно, это также может быть сохранено или может быть установлено по умолчанию для открытия (подобно загрузке файла). – Suezy

1

Я делаю это все время с LWP, но я уверен, что это в равной степени возможно с Mech

Я думаю, где вы могли бы быть неправильное использование Mech для запроса страницы, на которой есть кнопка, когда вы действительно хотите запросить контент со страницы, которую кнопка вызывает для отправки в браузер при нажатии.

Что вам нужно сделать, это просмотреть источник html страницы кнопкой, которая инициирует загрузку, и посмотреть, что связано с действием. Скорее всего, это будет POST с некоторыми скрытыми полями или URL-адресом, чтобы сделать GET.

Целевой URL-адрес клика содержит материал, который вы на самом деле хотите получить, а не URL-адрес страницы с кнопкой на нем.

+0

Вот как Мех предназначен для использования; вы используете его для перехода на веб-страницу, и он автоматически обрабатывает детали сбора полей и делает соответствующий запрос, когда вы говорите ему перейти на другую страницу. – ysth

+0

Понял - хотя я и выразил это, возможно, Я больше говорил о том, «как вы ориентируетесь», и была ли цель навигации правильной. – Auctionitis

1

Для таких проблем вам часто приходится исследовать всю цепочку событий, которые обрабатывает браузер. Используйте инструмент сниффера HTTP, чтобы увидеть все, что делает браузер, пока оно не попадет в файл. Тогда вы должны сделать то же самое в Мехе.