2

我最近在 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;
}

我在这里做错了什么吗?我能够在页面上的其他标签上产生实际结果,但具体不是这个。

提前致谢。

4

3 回答 3

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. 输出找到的节点的编号,我在这里$iforeach.
  2. var_dump->nodeValue它有助于显示它到底是什么。
  3. 利用saveHTML显示更好图片的功能输出HTML。

实际输出:

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

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

于 2013-01-24T23:11:15.163 回答
1

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

于 2013-01-24T23:10:27.083 回答
0

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

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

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

于 2013-01-24T23:10:06.240 回答