我有一个脚本,我向页面发送GET请求。我试图弄清楚如何压制输出,这是代码本身:
use IO::Socket;
my $domain = 'yahoo.com';
$socket=IO::Socket::INET->new(
Proto => 'tcp',
PeerAddr => $domain,
PeerPort => '80',
) or return $!;
print $socket "GET /index.php HTTP/1.0\r\n";
print $socket "Host: ", $domain, "\r\n";
print $socket "Connection: close", "\r\n";
print $socket "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "\r\n";
print $socket "Accept: text/html, application/xhtml+xml, */*", "\r\n\r\n";
print while <$socket>;
这是输出。
HTTP/1.0 200 OK
Server: nginx/1.4.7
Content-Type: text/html
X-Powered-By: PHP/5.4.27-1~dotdeb.0
Set-Cookie: PHPSESSID=k2bviiurukqdju1l26j4fat0q0; path=/
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Date: Sun, 18 May 2014 19:53:20 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
X-Page-Speed: 119_1_jt
X-XSS-Protection: 1; mode=block
Alternate-Protocol: 80:quic
Apache works!
如您所见,它显示了顶部的完整页面标题,我只想要页面输出。 我怎么能抑制服务器头的输出?并保留页面数据。
答案 0 :(得分:2)
如果您只是尝试发出网络请求,那么使用http
库几乎总是更好。
但是,对于这种特殊情况,以下内容也应该足够了。它只打印第一行后只有\r\n
的所有内容,因为这是用于将标题与http
协议中的内容分开的分隔符。
# The following line has been replaced with the loop
# print while <$socket>;
$seennl = 0;
while (<$socket>) {
if ($seennl) {
print;
}
elsif ($_ eq "\r\n"){
$seennl=1;
}
}
答案 1 :(得分:1)
HTTP standard指定标题和内容由空行分隔。因此,您可以放弃所有内容,直到第一个空行:
my $print = 0;
while (<$socket>) {
chomp;
if ($print) {
print $_, "\n";
}
elsif ($_ eq '') {
$print = 1;
}
}
如果你使用像LWP::UserAgent
这样的模块,它会更容易,你会更好地处理特殊情况:
use LWA::UserAgent;
use HTTP::Request;
my $req = HTTP::Request->new( GET => 'http://yahoo.com/index.php' );
my $ua = LWP::UserAgent->new;
my $res = $ua->request($req);
if ($res->is_success) {
print $res->content, "\n";
}
答案 2 :(得分:0)
我肯定会建议您使用较重的模块,例如LWP
或Mojo::UserAgent
,而不是重新创建滚轮。在Mojocast Episode 5
中,对后者有一段有用的8分钟视频介绍。
但是,因为HTTP的规范是用空行分隔标题,所以你可以在段落模式下进行初始读取以跳过标题:
# Skip Header
{
local $/ = "";
<$socket>;
}
print while (<$socket>);