2013-12-02 6 views
1

Я добываю данные с сайта, но там это paginator, но мне нужно получить все страницы. Ссылка на следующую страницу написана в теге link с rel = next. Если страниц больше нет, тег ссылки отсутствует. Я создал функцию, называемую getAll, которая должна вызывать self снова и снова, пока не появится тег ссылки.Указатели PHP - данные не получены

function getAll($url, &$links) { 
    $dom = file_get_html ($url); // create dom object from $url 
    $tmp = $dom->find('link[rel=next]', 0); // find link rel=next 
    if(is_object($tmp)){ // is there the link tag? 
     $link = $tmp->getAttribute('href'); // get url of next page - href attribute 
     $links[] = $link; // insert url into array 
     getAll($link, $links); // call self 
    }else{ 
     return $links; // there are no more urls, return the array 
    } 
} 

// usage 
$links = array(); 
getAll('http://www.zbozi.cz/vyrobek/apple-iphone-5/', $links); 
print_r($links); // dump the links 

Но у меня есть проблема, когда я запускаю сценарий сообщения «не получили данных» появляется в Chrome. Я не имею ни малейшего представления об ошибке или что-то в этом роде. Функция должна работать, потому что, когда я не использую ее снова, она возвращает одну ссылку - на вторую страницу.

Я думаю, что проблема заключается в неправильном использовании синтаксиса или плохой указатель.

Не могли бы Вы помочь мне?

+1

Ваша функция 'getAll', вы звоните' getLinks' внутри и на начальном этапе. –

+0

Извините, я переименовал его, когда писал. Ред. Проблема не в этом. – Northys

ответ

1

Я не знаю, что file_get_html или find должны делать, но это должно работать:

<?php 

function getAll($url, &$links) { 
    $dom = new DOMDocument(); 
    $dom->loadHTML(file_get_contents($url)); 
    $linkElements = $dom->getElementsByTagName('link'); 
    foreach ($linkElements as $link => $content) { 
     if ($content->hasAttribute('rel') && $content->getAttribute('rel') === 'next') { 
      $nextURL = $content->getAttribute('href'); 
      $links[] = $nextURL; 
      getAll($nextURL, $links); 
     } 
    } 
} 

$links = array(); 
getAll('http://www.zbozi.cz/vyrobek/apple-iphone-5/', $links); 
print_r($links); 
+0

'Предупреждение: DOMDocument :: loadHTML(): Неожиданный конечный тег: a в Entity, строка: 1 в E: \ var \ www \ _github \ BEOWULF \ index. php on line 6' – Northys

+0

Я полагаю, что это проблема на источнике zbozi.cz? ваше решение работает хорошо, спасибо! – Northys

0

Во-первых, это может быть проще. Без сообщения об ошибке это может быть что угодно: от ошибки DNS до поврежденного символа пробела внутри вашего файла. Так что если у вас нет, попробуйте добавить это к верхней части вашего скрипта:

error_reporting(E_ALL); 
ini_set("display_errors", "1"); 

Он должен выявить любые ошибки, которые могли иметь место. Но если это не работает, у меня есть две идеи:

У вас не может быть синтаксической ошибки, потому что скрипт даже не запустится. Вы сказали, что удаление рекурсии дало результат, поэтому скрипт должен работать.

Одна возможность - то, что время выпадения. Это зависит от конфигурации сервера. Попробуйте добавить

echo $url, "<br>"; 
flush(); 

наверх getAll. Если вы получаете какие-либо ссылки, это ваша проблема. Этот можно установить, позвонив по функции set_time_limit(0).

Другая возможность - ошибка подключения. Это может быть вызвано совпадением или лимитом конфигурации сервера. Я не могу быть уверен, но я знаю, что некоторые провайдеры хостинга ограничивают file_get_contents и curl запросами. Существует вероятность того, что ваши сценарии ограничены одним внешним запросом на выполнение.

Кроме того, я ничего не могу придумать, что может действительно пойти не так с вашим сценарием. Вы можете удалить рекурсию и запустить функцию в цикле while. Но если вы не ожидаете больших страниц, нет необходимости в такой модификации.

И, наконец, библиотека, которую вы используете для разбора DOM, либо вернет объект элемента DOM, либо null. Таким образом, вы можете изменить if(is_object($tmp)){ на if($tmp){. И поскольку вы передаете результат по ссылке, возвращающее значение бессмысленно. Вы можете безопасно удалить инструкцию else.

Желаю вам удачи.

+0

спасибо, я буду использовать ваш совет в будущей отладке :) – Northys

Смежные вопросы