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のデバッグスキルを向上させたい場合があります。ここにいくつかのヒント(デモ)があります。

<?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を出力します。

実際の出力:

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

要素が空であることを簡単に見つけることができるため、温度は他の場所から、たとえばjavascriptを介して入力する必要があります。ブラウザのネットワークツールを確認してください。

于 2013-01-24T23:11:15.163 に答える
1

何が起こるかは簡単です。ページには、javascriptを入力するためのプレースホルダーである空のid="theTemperature"要素が含まれています。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を実行すると、これらのスクリプトは明らかに解決されません。RSSを使用するguidoのソリューションを使用します

于 2013-01-24T23:10:06.240 に答える