1

Web ページを開き、ページ上のすべてのアウトバウンドリンクの href 値を保存するクラスを作成しています。何らかの理由で、最初の 3 つで動作し、その後おかしくなります。以下は私のコードです:

class Crawler {
var $url;

function construct($url) {
    $this->url = 'http://'.$url;
    $this->crawl();
}

function crawl() {
    $str = file_get_contents($this->url);
    $start = 0;
    for($i=0; $i<10; $i++) {
        $beg = strpos($str, '<a href="http://',$start)+16;
        $end = strpos($str,'"',$beg);
        $diff = $end - $beg;
        $links[$i] = substr($str,$beg, $diff);
        $start = $start + $beg;
    }
    print_r($links);
}
}

$crawler = new Crawler;
$crawler->construct('www.yahoo.com');

当分の間 for ループを無視します。これは最初の 10 個のみを返し、ドキュメント全体を処理しないことがわかっています。ただし、このコードを実行すると、最初の 3 つの値は正常に動作しますが、他のすべての値は UBLIC になります。誰でも助けることができますか?ありがとう

4

2 に答える 2

2

それ以外の:

$start = $start + $beg;

試す:

$start = $beg;

そのため、最初の 3 つの一致しか表示されない可能性があります。

$begまた、そうでないチェックを挿入する必要がありますFALSE

for($i=0; $i<10; $i++) {
    $beg = strpos($str, '<a href="http://',$start)+16;
    if ($beg === FALSE)
        break;
    //...

ただし、DOMDocument指定されたタグ名を持つドキュメント内のすべてのタグを検索するために実際に使用する必要があることに注意してください ( ahere )。特に、これは有効な XHTML ではない可能性がある HTML であるため、loadHTMLメソッドの使用を検討する必要があります。

于 2010-12-22T16:21:51.743 に答える
1

あなたの論理に問題があると思います:

$start を使用して、href の検索を開始する場所をマークしますが、結果$begは依然として完全な文字列へのインデックスになります。$startしたがって、追加して更新する$begと、高い値になります。$start = $beg + 1代わりに試してみてください$start = $start + $beg

于 2010-12-22T16:21:55.907 に答える