0

これが非常に単純な解決策であることを願っています。私は PHP を初めて使用するので、明らかな何かが欠けている可能性があります。ScraperWiki でスクレイパーを構築しています (ただし、これは PHP の問題であり、SW とはほとんど関係ありません)。コードは次のとおりです。

<?php
require 'scraperwiki/simple_html_dom.php';

$allLinks = array();

function nextPage($nextUrl, $y)
{
    getLinks($nextUrl, $y);    
}

function getLinks($url) // gets links from product list page   
{
    global $allLinks;
    $html_content = scraperwiki::scrape($url);
    $html         = str_get_html($html_content);

    if (isset($y)) {
        $x = $y;
    } else {
        $x = 0;
    }

    foreach ($html->find("div.views-row a.imagecache-product_list") as $el) {
        $url          = $el->href . "\n";
        $allLinks[$x] = 'http://www.foo.com';
        $allLinks[$x] .= $url;
        $x++;
    }

    $next = $html->find("li.pager-next a", 0)->href . "\n";
    print_r("Printing $next:");
    print_r($next);

    if (isset($next)) {
        $nextUrl = 'http://www.foo.com';
        $nextUrl .= $next;
        print_r($nextUrl);
        $y = $x;
        print_r("Printing X:");
        print_r($x);
        print_r("Printing Y:");
        print_r($y);

        nextPage($nextUrl, $y);
    } else {
        return;
    }

}

getLinks("http://www.foo.com/department/accessories");

print_r($allLinks);

?>

期待される出力: スクリプトは、最初のページからすべてのリンクをスクレイピングし、「次のページ」ボタンを見つけ、その URL からリンクをスクレイピングし、その URL から「次のページ」を見つけます。「次のページ」のリンクがなくなったら停止する必要があります。

CURRENT OUTPUT : コードは正常に実行されていますが、停止する必要があるときに停止しません。キーラインは次のとおりです。

$next = $html->find("li.pager-next a", 0)->href . "\n";
if (isset($next)) { }

li.pager-next aページに a が存在する場合にのみ、「nextPage()」関数を実行したい。コンソールからの出力は次のとおりです。

     http://www.foo.com/department/accessories?page=1
        http://www.foo.com/department/accessories?page=2
        http://www.foo.com/department/accessories?page=3
        http://www.foo.com/department/accessories?page=4
        http://www.foo.com/department/accessories?page=5
        http://www.foo.com/department/accessories?page=6
        http://www.foo.com/department/accessories?page=7
        http://www.foo.com/department/accessories?page=8
        http://www.foo.com/department/accessories?page=9
        http://www.foo.com/department/accessories?page=10

    PHP Notice:  Trying to get property of non-object in /home/scriptrunner/script.php on line 31
 // THE LOOP SHOULD BREAK HERE BUT DOESN'T

        http://www.foo.com
        http://www.foo.com/home?page=1
        http://www.foo.com/home?page=2
        http://www.foo.com/home?page=3
        http://www.foo.com/home?page=4
        http://www.foo.com/home?page=5
        http://www.foo.com/home?page=6
        http://www.foo.com/home?page=7
4

3 に答える 3

1

これはどうですか:

$next = $html->find("li.pager-next a", 0);

if (isset($next)) {
    $nextUrl = 'http://www.foo.com';
    $nextUrl .= $next->href; // move ->href here
    print_r($nextUrl . "\n"); // put \n here since we don't actually want that char in the url
    $y = $x;
    print_r("Printing X:");
    print_r($x);
    print_r("Printing Y:");
    print_r($y);

    nextPage($nextUrl, $y);
} else {
    return;
}
于 2013-02-22T23:58:06.283 に答える
0

によって返される値は何でも

$next = $html->find("li.pager-next a", 0)->href . "\n";

isset($next)追加しても false が返されることはありません"\n"

次のようなものを使用します。

$nextElement = $html->find("li.pager-next a", 0);

if(isset($nextElement))
{
    $nextUrl = 'http://www.foo.com' . $nextElement->href . PHP_EOL;

    print_r($nextUrl);
    $y = $x;
    print_r("Printing X:");
    print_r($x);
    print_r("Printing Y:");
    print_r($y);

    nextPage($nextUrl, $y);
}
于 2013-02-22T23:58:28.027 に答える
-2

isset() を削除するだけです

    もし($next){
    }
    

于 2013-02-23T00:01:52.977 に答える