1

我需要登录到一个站点,解析 HTML 页面并提取特定 HTML 标记之间的值。

我可以在不需要登录数据的页面上成功执行此操作。我正在使用 HTML::Parser 类。

LWP::UserAgent 提供了 cookie_jar 方法来通过从文件中加载来设置 cookie。但是,我想在脚本本身中对 cookie 值进行硬编码。那可能吗?我在网上找不到任何工作示例。

这是我的代码:

请原谅在几个地方的变量声明中缺少“我的”。我匆忙写了这段代码,试图理解 LWP::UserAgent 中 Cookie 处理的概念。

#!/usr/bin/perl

use strict;
use warnings;
use HTTP::Request::Common;
use LWP::UserAgent;
use HTTP::Response;
use HTTP::Cookies;

package IdentityParse;
use base "HTML::Parser";

my $title_flag=0;
my $title="";

my $cookie_jar= HTTP::Cookies->new;
$cookie_jar->clear;
$cookie_jar->set_cookie(Name=Value); #Example, PHPSESSID=710c7aa60aa5cacdc40028ef79de24b2

sub text{
my($self,$text)=@_;
if($title_flag)
{
    $title.=$text;
}
}

sub start{
my($self,$tag,$attr,$attrseq,$origtext)=@_;
if($tag =~ /^title$/i)
{
    $title_flag=1;
}
}

sub end{
my($self,$tag,$origtext)=@_;
if($tag =~ /^title$/i)
{
    $title_flag=0;
}
}

my $url="http://sitename.com/users/index.php";

my $ua= LWP::UserAgent->new();
$ua->agent('NeonFlash');
$ua->timeout(30);
$ua->cookie_jar($cookie_jar);

my $req= HTTP::Request->new(GET => $url);
my $res= ($ua->request($req))->content;

my $p = new IdentityParse;
$p->parse($res);

$p->eof;

print "The title of the web page is: ".$title."\n";

概括:

我正在使用 HTML::Parser 类来解析 HTTP 响应 HTML 页面。为了读取标签之间的值,我重写了 HTML::Parser 的方法、开始、文本和结束。

cookie 值以 Key 和 Value 的形式传递。我知道,虽然我自己没有尝试过,但可以从文本文件中加载 cookie。但我想知道我们是否也可以这样做。

谢谢。

4

3 回答 3

1

这是 HTTP::Cookies::set_cookie 的源代码

子集_cookie
{
    我的 $self = 班次;
    我的($版本,
       $key, $val, $path, $domain, $port,
       $path_spec, $secure, $maxage, $discard, $rest) = @_;

    # path 和 key 不能为空(key 不能以 '$' 开头)
    如果 !defined($path) || 则返回 $self $path !~ m,^/, ||
                !定义($key) || $key =~ m,^\$,;

    # 确保合法端口
    如果(定义 $port){
    返回 $self 除非 $port =~ /^_?\d+(?:,\d+)*$/;
    }   

好像如果你想为 cookie_jar 设置 cookie,你必须传递数组而不是 ''' key=value'''
或者你也可以使用 LWP::UserAgent::default_header 来设置请求 cookie。
因为 HTTP cookie 是

于 2013-01-19T06:40:04.877 回答
0

只需CookieHTTP::Request类设置 HTTP 标头。

您的解析代码看起来很痛苦。对于声明性方法,请使用Web::QueryHTML::Query

于 2011-10-27T12:30:29.280 回答
-1

对于这类任务,我更喜欢WWW::Mechanize模块。

于 2011-10-25T18:44:59.053 回答