Запрос PHP XPath ничего не возвращает


person Crawdingle    schedule 24.01.2013    source источник
comment
Если я загружаю URL-адрес с помощью wget, я вижу, что элемент температуры пуст.   -  person guido    schedule 25.01.2013
comment
Элемент theTemperature заполняется jquery в функции displayObs   -  person guido    schedule 25.01.2013
comment
@guido, если я повторю $url в следующей строке, я увижу там температуру. Хотя не уверен, что это что-то значит.   -  person Crawdingle    schedule 25.01.2013
comment
почему бы вам не использовать это: rss.theweathernetwork.com/weather/cape0005   -  person guido    schedule 25.01.2013
comment
@guido Хорошая идея, да, я оставлю это открытым, потому что я хотел бы знать, не делаю ли я что-то неправильно с моей стороны.   -  person Crawdingle    schedule 25.01.2013
comment
что происходит, просто, страница содержит пустой элемент id=theTemperature, который является заполнителем для заполнения с помощью javascript. file_get_contents() просто загрузит страницу, не выполняя javascript, поэтому элемент останется пустым. Попробуйте загрузить страницу в браузере с отключенным javascript, чтобы убедиться в этом самостоятельно.   -  person guido    schedule 25.01.2013
comment
@Гвидо О! Попался. Спасибо за пояснение, сам вижу. Вы должны прокомментировать для меня, чтобы отметить правильный ответ?   -  person Crawdingle    schedule 25.01.2013


Ответы (3)


то, что происходит, просто: страница содержит пустой элемент id="theTemperature", который является заполнителем для заполнения с помощью javascript. file_get_contents() просто загрузит страницу, не выполняя javascript, поэтому элемент останется пустым. Попробуйте загрузить страницу в браузере с отключенным javascript, чтобы убедиться в этом самостоятельно.

person guido    schedule 24.01.2013

Возможно, вы захотите улучшить свои навыки отладки 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. Выведите HTML, используя функцию saveHTML, которая показывает лучшую картинку.

Фактический результат:

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

Вы можете легко определить, что элемент пуст, поэтому температура должна поступать откуда-то еще, например. через джаваскрипт. Проверьте сетевые инструменты вашего браузера.

person hakre    schedule 24.01.2013
comment
Я также хотел спросить о лучших методах отладки. Отличные знания, спасибо! - person Crawdingle; 25.01.2013
comment
Проверьте инструменты разработки вашего браузера, например. Я нашел это здесь: codepad.viper-7.com/pI8XCB - person hakre; 25.01.2013

Элемент, который вы пытаетесь выбрать, действительно пуст. Страница загружает температуру в этот идентификатор через ajax. Конкретно этот скрипт:

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

но когда вы делаете file_get_contents, эти сценарии, очевидно, не разрешаются. Я бы выбрал решение guido с использованием RSS

person JoelKuiper    schedule 24.01.2013