PHP XPath查询什么都不返回

时间:2013-01-24 22:33:30

标签: php xpath domxpath

我最近在PHP中使用DOMXpath并取得了成功,试图获得更多使用体验我一直在玩抓住不同网站的某些元素。我无法从http://www.theweathernetwork.com/weather/cape0005这个网站上获取天气标记。

特别是我想要

//*[@id='theTemperature']

这就是我所拥有的

$url = file_get_contents('http://www.theweathernetwork.com/weather/cape0005');

$dom   = new DOMDocument();
@$dom->loadHTML($url);
$xpath = new DOMXPath($dom);
$tags  = $xpath->query("//*[@id='theTemperature']");
foreach ($tags as $tag){
    echo $tag->nodeValue;
}

我在这里做错了吗?我能够在页面上的其他标签上生成实际结果,但特别是没有这个。

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可能希望改进DOMDocument调试技巧,这里有一些提示(Demo):

<?php
header('Content-Type: text/plain;');

$url = file_get_contents('http://www.theweathernetwork.com/weather/cape0005');

$dom   = new DOMDocument();
@$dom->loadHTML($url);
$xpath = new DOMXPath($dom);
$tags  = $xpath->query("//*[@id='theTemperature']");
foreach ($tags as $i => $tag){
    echo $i, ': ', var_dump($tag->nodeValue), ' HTML: ', $dom->saveHTML($tag), "\n";
}
  1. 输出找到的节点的编号,我在$i中使用foreach执行此操作。
  2. var_dump ->nodeValue,有助于显示它究竟是什么。
  3. 使用显示更好图片的saveHTML函数输出HTML。
  4. 实际输出:

    0: string(0) ""
     HTML: <p id="theTemperature"></p>
    

    你可以很容易地发现元素是空的,所以温度必须从其他地方进入,例如通过javascript。检查浏览器的网络工具。

答案 1 :(得分:1)

发生的事情很简单,页面包含一个空的id =“theTemperature”元素,它是一个用javascript填充的占位符。 file_get_contents()将只下载页面,而不是执行javascript,因此元素保持为空。尝试在禁用javascript的情况下在浏览器中加载页面以自行查看

答案 2 :(得分:0)

您尝试选择的元素确实是空的。该页面通过ajax将温度加载到该id中。特别是这个脚本:

http://www.theweathernetwork.com/common/js/master/citypage_ajax.js?cb=201301231338

但是当你执行file_get_contents时,这些脚本显然无法解决。我会选择使用guido的RSS解决方案