簡體   English   中英

WWW :: Mechanize :: Firefox通過鏈接循環

[英]WWW::Mechanize::Firefox looping though links

我正在使用一個foreach來遍歷鏈接。 我需要$mech->back();$mech->back(); 繼續循環還是隱式的。

此外,是否需要為每個循環嵌套一個單獨的$mech2對象?

我當前擁有的代碼被卡住(無法完成),並在找不到td#tabcolor3的第一頁結束。

foreach my $sector ($mech->selector('a.link2'))
{
    $mech->follow_link($sector);

    foreach my $place ($mech->selector('td#tabcolor3'))
    {
            if (($mech->selector('td#tabcolor3', all=>1)) >= 1)
    {
        $mech->follow_link($place);
            print $_->{innerHTML}, '\n'
            for $mech->selector('td.dataCell');
        $mech->back();
    }
    else
    {
        $mech->back();
    }
}

我建議為此使用單獨的$ mech對象:

foreach my $sector ($mech->selector('a.link2'))
{
    my $mech = $mech->clone();
    $mech->follow_link($sector);

    foreach my $place ($mech->selector('td#tabcolor3'))
    {
            if (($mech->selector('td#tabcolor3', all=>1)) >= 1)
    {
            my $mech = $mech->clone();
            $mech->follow_link($place);
            print $_->{innerHTML}, '\n'
            for $mech->selector('td.dataCell');
        #$mech->back();
    }
#    else
#    {
#        $mech->back();
#    }
}

當頁面上不再顯示信息時,您將無法訪問該信息。 但是, foreach工作方式是遍歷列表,然后再遍歷列表,因此您編寫的代碼應該沒問題。

鏈接是絕對的,因此無需back叫。 如果您使用過click則頁面中必須有一個鏈接可以單擊,但是使用follow_link您要做的就是轉到一個新的URL。

也不需要檢查要跟隨的鏈接數,因為將不會執行對空列表的for循環。

為了使事情更清楚,我建議您在循環之前將selector的結果分配給數組。

像這樣

my @sectors = $mech->selector('a.link2');
for my $sector (@sectors) {

    $mech->follow_link($sector);

    my @places = $mech->selector('td#tabcolor3');
    for my $place (@places) {

        $mech->follow_link($place);

        print $_->{innerHTML}, '\n' for $mech->selector('td.dataCell');
    }
}

更新

我很抱歉。 似乎follow_link挑剔,需要在當前頁面上關注鏈接。

我建議您從每個鏈接中提取href屬性,並使用get而不是follow_link

my @selectors = map $_->{href}, $mech->selector('a.link2');
for my $selector (@selectors) {

    $mech->get($selector);

    my @places = map $_->{href}, $mech->selector('td#tabcolor3');
    for my $place (@places) {

        $mech->get($place);

        print $_->{innerHTML}, '\n' for $mech->selector('td.dataCell');
    }
}

請讓我知道這在您連接的網站上是否有效。

我正在使用WWW:Mechanize :: Firefox遍歷一堆帶有Javascript負載的URL。 該頁面不會立即呈現,因此需要測試某個頁面元素是否可見(類似於Mechanize :: Firefox文檔中的建議,但測試中有2個xpath),然后再決定下一步。

大約2-3秒后,該頁面最終將xpath呈現為“無信息”或一些所需的東西。 如果沒有信息,我們轉到下一個URL。 我認為存在某種競爭條件,兩個xpath都不同時導致MozRepl::RemoteObject: TypeError: can't access dead object間歇性地MozRepl::RemoteObject: TypeError: can't access dead object錯誤(在循環中的sleep 1足夠奇怪)。

我的可行/提高可靠性的解決方案是將所有$mech->get $mech->is_visible $mech->get$mech->is_visibleeval{}; 像這樣:

eval{ 
  $mech->get("$url");
  $retries = 15; #test to see if element visible = page complete
  while ($retries-- and ! $mech->is_visible( xpath => $xpath_btn ) and  ! $mech->is_visible( xpath => $xpath_no_info )){
    sleep 1;
  };
  last if($mech->is_visible( xpath => $xpath_no_info) ); #skip rest if no info page
};

其他人可能會建議對此進行改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM