2016-01-19 16 views
1

我寫了一個腳本來登錄到網頁並打印響應。現在我想在HTML響應中找到一個字符串,但我不知道如何。如何在HTML響應中查找字符串

我當前的代碼:從$body

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; 

當前打印輸出

<!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> 

我如何才能找到在響應中的版本字符串和數量,並將其寫入到一個變量?

該腳本的目標是獲取版本號並將其寫入文件。

回答

-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"; 
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"; 
+0

這就是我的意思與屏幕抓取。 :) – simbabque

+0

@simbabque:我喜歡* Mojolicious *這類工作,但不知何故很難說服人們使用它。 'HTML :: TreeBuilder'現在變得有點長了 – Borodin

+0

我會建議_Web :: Scraper_。我喜歡這個簡單的拼寫。 _WWW :: Mechanize_也可以在這裏工作。儘管他們的HTML解析器非常強大,但我並不是最大的Mojo粉絲。我想我不喜歡他們自己的態度。 – simbabque

1

這裏有一個Mojo例子。 LWP :: UserAgent和Mojo::UserAgent之間有一些差異,這對我來說是值得的。首先,get返回一個知道請求和響應的事務。這可能並不重要,但我發現我經常需要它。接下來,我可以立即獲得一個DOM對象,並使用CSS選擇器調用find,比如h1 > p,這意味着「h之後的p」。從那我得到一個集合,我可以撥打map。在這種情況下,我告訴map從發現thingys收集調用每個項目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以外的風險來破壞安裝過程的一部分。

+0

也許'我的$ version = $ tx-> res-> dom-> find('h1> p') - > [0] - > text'?沒有必要提取所有找到的元素的文本內容。 – Borodin