使用curl和xpath抓取网站

时间:2017-01-06 20:56:35

标签: php curl xpath

我想抓取此网站并将表格放在http://www.basketligaen.dk/da/top/turnering/stilling/,但是当我尝试获取内容时,我会DOMNodeList Object ( [length] => 0 )。 我的代码如下所示:

    $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 :(得分:0)

table元素下面div元素下面没有id="3739"元素。

该表位于div元素下id="3738",而不是直接,这应该有效:

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

请注意双斜杠,这意味着父子关系,但在任何深度级别。

作为旁注,我并不特别喜欢当前XPath表达式的可读性和健壮性 - 3738 id有点“含糊不清”,它没有带来任何有价值的数据导向信息和很有可能被改变。可能更好的方法是依赖表头:

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

所有这一切,这里有一个更大的问题 - 该表是JavaScript“小部件”的一部分,并由您的浏览器及其JavaScript引擎动态配置和加载。当您使用“curl”下载页面时,您只能获得不包含所需表格的初始HTML页面。

最简单的(在实现方面)解决方法之一是通过例如selenium自动化真实的浏览器。关于上面提到的XPath表达式的要点仍然适用,因为除其他外,还有“by xpath”定位器。