如何在HTML响应中找到字符串

时间:2016-01-19 14:55:32

标签: perl lwp

我编写了一个脚本来登录网页并打印回复。现在我想在HTML响应中找到一个字符串,但我不知道如何。

我目前的代码:

use strict;
use warnings;
use LWP::UserAgent;


my $clientIP = "129.168.1.50:80";
my $clientURL = "http://" . $clientIP . "/conf";

## User Agent (UA)
my $ua=LWP::UserAgent->new;
$ua->timeout(10);

$ua->credentials($clientIP, 'Secure Area', 'user', 'pa$$word');

my $page = $ua->get($clientURL);
my $body = $page->content();
print $body;

$body的当前打印输出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>configuration</title>
</head>

<body>
        <h1>Client</h1>
        <p>
                Version
                2.16.4.9</p>
        <a href="settings">Settings</a>
        <br>
        <a href="updateskin">Update skin</a>
        <br>
        <a href="updatesettings">Update settings</a>
        <br>
        <p>Software Solutions</p>
</body>
</html>

如何在响应中找到版本字符串和数字并将其写入变量?

脚本的目标是获取版本号并将其写入文件。

3 个答案:

答案 0 :(得分:2)

我建议您使用HTML::TreeBuilder来处理HTML并允许您导航生成的结构

代码看起来像这样

use strict;
use warnings 'all';

use HTML::TreeBuilder;

my $client_ip  = '129.168.1.50:80';
my $client_url = "http://$client_ip/conf";

my $tree = HTML::TreeBuilder->new_from_url($client_url);

my $version;

for my $p ( $tree->look_down(_tag => 'p') ) {
    my $text =  $p->as_trimmed_text;
    if ( $text =~ / version /ix ) {
        $version = $text;
        last;
    }
}

print $version, "\n";

答案 1 :(得分:1)

这是一个Mojo示例。 LWP :: UserAgent和Mojo::UserAgent之间存在一些差异,这对我来说是值得的。首先,get返回一个知道请求和响应的事务。这可能不重要,但我发现我经常想要它。接下来,我可以立即获得一个DOM对象,并使用CSS选择器调用find,例如h1 > p,这意味着&#34; h1&#34;之后的p。从那里我得到一个我可以打电话给map的集合。在这种情况下,我告诉map从找到的东西集合中的每个项目上调用text方法:

use Mojo::UserAgent;

my $url = "http://$user:$password\@$clientIP/conf";

my $ua = Mojo::UserAgent->new;

my $tx   = $ua->get($url);

my( $version ) = $tx->res->dom->find( 'h1 > p' )->map( 'text' );

我最不喜欢的是Mojolicious是独立的。我没有必要安装多件东西,并且在Mojo之外冒险破坏安装过程的一部分。

答案 2 :(得分:-1)

感谢您的帮助。正则表达式是最简单的解决方案。

# Remove all wordwraps
while($body=~s/[\n\r\l]//){} 
my $ver='unknown'; # Default version
if($body=~/version\s*([0-9\.]+)/i){$ver=$1;}
print "\n" . $ver . "\n";