我想抓取此网站并将表格放在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);
之前我抓过很多页面,但我找不到这个问题 - 是否有人可以看到我做错了什么?
答案 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”定位器。