2

WWW::Mechanize或任何 Perl 模块中是否有一种方法可以在访问网站后读取文件。例如,我单击了一个按钮'Receive',然后会出现一个包含消息的文件 (.txt)。我将如何阅读内容?非常感谢答案..我已经为此工作了好几天,此外,我尝试了所有可能性。任何人都可以帮忙吗?如果你能给我一个想法好吗?:)

这是我的代码的一部分:

...

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()

;

之后,将出现“下载”对话框,以便我可以保存文件(但我也可以将默认设置为立即打开而不是保存)。问题是,我怎样才能读取这个文件的内容?

..

4

6 回答 6

4

我认为您的意思是网站通过返回您希望保存的非 HTML 响应(例如“文本/纯文本”文件)来响应表单提交。

我相信你想要$mech->save_content( $filename )

添加:

首先,您需要提交WWW:Mech 的表单提交,然后保存生成的(文本)文件。click用于单击按钮,而您想使用$mech->submit()or提交表单$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');
于 2010-02-15T02:45:44.877 回答
2

点击后(假设它正在做它应该做的事情),返回的数据应该存储在你的 $mech 对象中。您应该能够使用 获取文件数据$mech->content(),也许在使用 验证成功$mech->status()和响应类型之后$mech->content_type()

记住 WWW::Mechanize取代了浏览器可能会有所帮助。浏览器所做的任何事情,例如打开下载窗口和保存文件,实际上都不会发生,但浏览器将拥有的所有信息都可以通过 WWW::Mechanize 的方法访问。

于 2010-02-15T02:44:56.860 回答
1

我敢问……你试过这个吗?

my $content = $mech->content();
于 2010-02-15T02:45:37.523 回答
1

打开文件 (不是“下载”窗口),就像您在浏览器中查看它一样;您可以稍后用几行代码保存它。

前提是您已HTML::TreeBuilder安装:

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

应该为您提供打开的结果窗口的文本。

然后打开一个文件句柄将结果写入:

open my $fileHandle, ">", "results.txt";
print $fileHandle $textFile;
close $fileHandle;
于 2010-02-15T06:17:14.430 回答
1

我一直使用 LWP 这样做,但我确信使用 Mech 也同样可能

我认为您可能出错的地方是使用 Mech 请求具有按钮的页面,而您实际上想要从页面请求内容,该页面在单击时按钮导致发送到浏览器。

您需要做的是查看带有启动下载按钮的页面的 html 源代码,并查看与该按钮关联的 Action 是什么。很可能它是一个带有一些隐藏字段的 POST 或一个执行 GET 的 URL。

单击的目标 URL 包含您实际想要获取的内容,而不是带有按钮的页面的 URL。

于 2010-02-15T22:33:48.130 回答
1

对于此类问题,您通常必须调查浏览器处理的完整事件链。使用 HTTP 嗅探器工具查看浏览器在访问文件之前所做的一切。然后你必须在 Mech 中做同样的事情。

于 2010-02-26T02:00:59.543 回答