2012-08-15 102 views
2

我使用WWW :: Mechanize庫來從網站刮取內容。但是,我注意到網頁的原始HTML源代碼和WWW :: Mechanize解析的內容不同。因此,腳本中的一些功能會被破壞。Perl WWW ::機械化解析內容問題?

所以,這裏是腳本(一個子集,只是爲了演示錯誤/問題)

#! /usr/bin/perl 

use WWW::Mechanize; 
use warnings; 

$mech=WWW::Mechanize->new(); 
$mech->stack_depth(0); 

$url="http://www.example.com"; 

$mech->get($url); 

print $mech->content; 

短期和簡單的代碼,它會連接到網站和檢索整個HTML頁面。

我運行腳本並將輸出重定向到文本文件,以便我可以分析它們。

perl test.pl >> source_code.txt 

現在,當我比較source_code.txt和由瀏覽器(Firefox)中顯示的網站的實際的源代碼,也有不同之處。

例如:

<tr> 
<td nowrap="nowrap">This is Some Text</td> 
<td align="right"><a href="http://example.com?value=key">Some more Text</a></td> 
</tr><tr> 

上述源代碼是什麼是在瀏覽器中觀察到的。 (查看頁面源代碼功能)

然而,在文本文件中,source_code.txt(由WWW ::機械化生成)

它表明:

<tr> 
<td nowrap="nowrap">This is some text</td> 
<td align="right">This is some more text</td> 
</tr><tr> 

正如你所看到的,錨標籤它被嵌套在第二組標籤之間被刪除。

這是已知問題還是我需要使用$ mech-> content以外的其他東西來查看源代碼?

謝謝。

+1

我會首先檢查用戶代理是否對服務器返回的內容產生影響。如果您在'new()'調用中添加'agent =>'Windows IE 6''會發生什麼? – LHMathies 2012-08-15 10:36:23

回答

4

這是一種常見行爲,如"user agent sniffing",例如,對於盲人用戶,頁面將以不同方式顯示。你可以改變你的用戶代理字符串與不同的插件,瀏覽器,也可以作爲@LHMathies說,在WWW ::機械化看到UserAgent.pmMechanize->new

例子:

my $mech = WWW::Mechanize->new(agent => 
    'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)' 
); 

a list of common user agent strings看到。

+1

還有' - > agent_alias()'方法,儘管這些別名很久沒有更新過了。 http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize.pm#$mech-%3Eagent_alias%28_$alias_%29 – 2012-08-17 21:12:05

+1

謝謝。我將嘗試與用戶代理。 – 2012-08-18 01:06:54