2017-01-06 168 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); 

我以前爬了很多的網頁,但我不能找到與這一個問題 - 有沒有誰可以看到什麼,我做錯了什麼?

回答

0

直接在div元素下面沒有table元素,id="3739"

表是直接id="3738",而不是div元素,這應該工作:

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

注意雙斜線,這意味着父母與子女的關係,但在任何深度的水平。


作爲一個方面說明,我特別不喜歡的可讀性和當前XPath表達式的魯棒性 - 在3738 ID是一種「神祕」,它不會帶來任何有價值的面向數據的信息和有很大的機會被改變。也許,更好的辦法是依靠表頭:

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

所有這一切說,還有這裏是一個更大的問題 - 該表是一個JavaScript「小工具」的一部分,配置和由您的瀏覽器和它的JavaScript引擎動態加載。當你用「curl」下載你的頁面時,你只會得到不包含所需表格的最初的HTML頁面。

最簡單的(在實施方面)變通辦法之一是通過例如selenium自動化一個真實的瀏覽器。上面提到的有關XPath表達式的觀點仍然適用,因爲除此之外,還有「by xpath」定位器。

+0

將其更改爲:$ elements = $ xpath-> query(「// div [@ id ='3739'] // table」);然後打印元素:print_r($ elements); - 我仍然得到:DOMNodeList Object([length] => 0)。我不應該得到大於0的長度,還是我失去了一些東西? –

+0

@AndreasBaran啊,即使你使用答案中的其他表達式,你也會得到空的結果嗎? – alecxe

+0

是的 - 當運行這個:$ elements = $ xpath-> query(「// div [。='Grundspil']/following-sibling :: table」); print_r($ elements);我仍然得到一個空的結果 –