2017-01-06 22 views
1

私はこのサイトをクロールしてテーブルを立てたいです。http://www.basketligaen.dk/da/top/turnering/stilling/ですが、コンテンツを取得しようとするとDOMNodeList Object ([length] => 0)となります。 私のコードは次のようになります。curlとxpathを使用してウェブサイトをクロールする

$curl = curl_init('http://www.basketligaen.dk/da/top/turnering/stilling/'); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10'); 
    $html = curl_exec($curl); 
    curl_close($curl); 

    $doc = new DOMDocument(); 
    $doc->loadHTML($html); 
    $xpath = new DOMXpath($doc); 
    $elements = $xpath->query("//div[@id='3739']/table"); 
    print_r($elements); 

私は前のページの多くをクロールしましたが、私はこの1つの問題点を見つける傾ける - 私が間違っているのかを見ることができる人はありますか?

答えて

0

divの要素の直下にid="3739"の要素の下にはtable要素はありません。

表は直接id="3738"ないとdiv要素の下で、これは動作するはずです:

//div[@id='3738']//table 

注親子関係を意味し、ダブルスラッシュが、任意の深さのレベルで。サイドノートとして


、私は特に読みやすさと、現在のXPath式の堅牢好きではない - 3738 idが「不可解」の一種である、それは任意の貴重なデータ指向の情報を持っていないと変更される可能性が高い。おそらく、より良い方法は、テーブルのヘッダーに依存するようになります:

//div[. = 'Grundspil']/following-sibling::table 

ここに大きな問題がある、と述べているすべて - テーブルではJavaScript「ウィジェット」の一部であり、設定されていて、あなたのブラウザとJavaScriptエンジンによって動的に読み込まれます。 「カール」でページをダウンロードすると、目的の表が含まれていない最初のHTMLページだけが表示されます。

最も簡単な(実装上の)回避策の1つは、seleniumなどの実ブラウザを自動化することです。上記で作成されたXPath式についてのポイントは、とりわけ "by xpath"ロケータがあるため、まだ適用可能です。

+0

$ element = $ xpath-> query( "// div [@ id = '3739'] // table");その要素を印刷します:print_r($ elements); - 私はまだ取得:DOMNodeListオブジェクト([長さ] => 0)。私は長さを0より大きくするべきではないか、それとも私が何かを欠いている私ですか? –

+0

@AndreasBaranああ、答えの中の他の式を使用しても空の結果が得られますか? – alecxe

+0

はい - これを実行すると、$ elements = $ xpath-> query( "// div [。= 'Grundspil']/following-sibling :: table"); print_r($ elements);私はまだ空の結果を得る –

関連する問題