2012-12-19 102 views
3

我正在嘗試關注Perl中的鏈接。 我最初的代碼:WWW :: Mechanize :: Firefox follow_link無法正常工作

use WWW::Mechanize::Firefox; 
use Crypt::SSLeay; 
use HTML::TagParser; 
use URI::Fetch; 
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}=0; #not verifying certificate 
my $url = 'https://'; 
$url = [email protected][0]; 

my $mech = WWW::Mechanize::Firefox->new; 
$mech->get($url); 

$mech->follow_link(tag => 'a', text => '<span class=\"normalNode\">VSCs</span>'); 
$mech->reload(); 

我發現here標籤文本選擇以這種方式工作,但我得到了錯誤MozRepl :: RemoteObject的:語法錯誤:表達式是不是合法的表達。我試圖逃避文本中的某些字符,但錯誤仍然相同。 後來我改變了我的代碼添加:

my @list = $mech->find_all_links(); 
my $found = 0; 
my $i=0; 
while($i<=$#list && $found == 0){ 
    print @list[$i]->url()."\n"; 
    if(@list[$i]->text() =~ /VSCs/){ 
    print @list[$i]->text()."\n"; 
    my $follow [email protected][$i]->url(); 
    $mech->follow_link(url => $follow); 
} 
    $i++; 
} 

不過話又說回來有一個錯誤:沒有鏈接找到匹配的「//一個[(@ HREF =「https://開頭...和多很多看起來是鏈接的描述 我希望我自己清楚,如果不是,請告訴我還有什麼要補充的,謝謝大家的幫助。 :

<li id="1" class="liClosed"><span class="bullet clickable">&#160;</span><b><a href="/centcfg/vsc_list.asp?entity=allvsc&amp;selector=All"><span class="normalNode">VSCs</span></a></b> 
     <ul id="1.l1"> 
     <li id="i1.i1" class="liBullet"><span class="bullet">&#160;</span><b><a href="/centcfg/vsc_edit.asp?entity=vsc&amp;selector=1"><span class="normalNode">First</span></a></b></li> 
     <li id="i1.i2" class="liBullet"><span class="bullet">&#160;</span><b><a href="/centcfg/vsc_edit.asp?entity=vsc&amp;selector=2"><span class="normalNode">Second</span></a></b></li> 
     <li id="i1.i3" class="liBullet"><span class="bullet">&#160;</span><b><a href="/centcfg/vsc_edit.asp?entity=vsc&amp;selector=3"><span class="normalNode">Third</span></a></b></li> 
     <li id="i1.i4" class="liBullet"><span class="bullet">&#160;</span><b><a href="/centcfg/vsc_edit.asp?entity=vsc&amp;selector=4"><span class="normalNode">Fourth</span></a></b></li> 
     <li id="i1.i5" class="liBullet"><span class="bullet">&#160;</span><b><a href="/centcfg/vsc_edit.asp?entity=vsc&amp;selector=5"><span class="normalNode">None</span></a></b></li> 
</ul> 

我在Windows 7中工作,MozRepl的版本是1.1,我使用Perl的草莓5.16.2.1 64位

+0

我最近試過安裝W :: M :: F,但是拿不到。你在運行什麼平臺/版本?你正在運行什麼firefox和mozrepl.xpi版本?您正在運行哪些版本的perl模塊(MozRepl,W :: M :: F等)? :-) –

+0

我重新編輯了我的文章,我的W :: M :: F版本我不知道只安裝了一個cpan shell:P –

回答

0

我建議你嘗試:

$mech->follow_link(url_regex => qr/selector=All/); 
+0

是的,我做過。但我得到了錯誤**找不到匹配的鏈接'// a [(text()=「VSCs」)]'**。我認爲這是因爲文本不是_VSCs_是VSCs _ –

+0

您可以發佈更完整的示例HTML嗎?我在那裏看不到'a'標籤。或者更好的是,真正的URL –

+0

這是不可能的真實URL,我只是編輯了我的帖子。 「我在那裏看不到'標籤」是什麼意思? –

2

與給定的代碼打交道了之後我是能夠使W¯¯::中號:: F到按照下面的方式來鏈接:

use WWW::Mechanize::Firefox; 
use Crypt::SSLeay; 
use HTML::TagParser; 
use URI::Fetch; 

... 

$mech->follow_link(xpath => '//a[text() = "<span class=\"normalNode\">VSCs</span>"]'); 
$mech->reload(); 

注意給出的,而不是textxpath參數。

我沒有長時間關注W :: M :: F源代碼,但試圖將給定的text參數轉換爲XPath字符串,並且如果text包含一定數量的XML/HTML標記,即你的情況,可能會讓他發瘋。

+0

嗯,它遵循鏈接,但樣式表之一。實際上是HTML中的第一個鏈接。任何想法爲什麼?我有點困惑 –

+0

您是否嘗試將'tag =>'a''參數添加回'follow_link()'調用?我不確定它爲什麼不識別XPath查詢。 –

+0

順便說一句,只是試圖調用follow_link()像'$ mech-> follow_link(tag =>'a',text_regex => qr/VSCs /);'它引導我到正確的鏈接。 –