如何在 HTML 响应中查找字符串
How to find string in HTML response
我写了一个脚本来登录网页并打印响应。现在我想在 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>
如何在响应中找到版本字符串和编号并将其写入变量?
脚本的目标是获取版本号并将其写入文件。
我建议您使用 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";
这里有一个 Mojo example. There are a few differences between LWP::UserAgent and Mojo::UserAgent 对我来说值得。首先,get
returns 一个知道请求和响应的事务。这在这里可能并不重要,但我发现我经常需要它。接下来,我可以立即获得一个 DOM 对象并使用 CSS 选择器对其调用 find
,例如 h1 > p
表示 "the p after h1"。从那里我得到一个我可以调用 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 是 self-contained。我不必安装多个东西,也不必冒 Mojo 之外的东西破坏安装过程的一部分的风险。
感谢您的帮助。正则表达式是最简单的解决方案。
# Remove all wordwraps
while($body=~s/[\n\r\l]//){}
my $ver='unknown'; # Default version
if($body=~/version\s*([0-9\.]+)/i){$ver=;}
print "\n" . $ver . "\n";
我写了一个脚本来登录网页并打印响应。现在我想在 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>
如何在响应中找到版本字符串和编号并将其写入变量?
脚本的目标是获取版本号并将其写入文件。
我建议您使用 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";
这里有一个 Mojo example. There are a few differences between LWP::UserAgent and Mojo::UserAgent 对我来说值得。首先,get
returns 一个知道请求和响应的事务。这在这里可能并不重要,但我发现我经常需要它。接下来,我可以立即获得一个 DOM 对象并使用 CSS 选择器对其调用 find
,例如 h1 > p
表示 "the p after h1"。从那里我得到一个我可以调用 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 是 self-contained。我不必安装多个东西,也不必冒 Mojo 之外的东西破坏安装过程的一部分的风险。
感谢您的帮助。正则表达式是最简单的解决方案。
# Remove all wordwraps
while($body=~s/[\n\r\l]//){}
my $ver='unknown'; # Default version
if($body=~/version\s*([0-9\.]+)/i){$ver=;}
print "\n" . $ver . "\n";