Задать вопрос

Почему не работает функция Simple HTML DOM в цикле?

Такая проблема, копирую список стримов с сайта через SimpleHTMLDOM. Проблема в том, что список размещен на нескольких страницах-категориях. Через foreach я делаю загрузку нескольких категорий, однако начиная со второй итерации функции simple HTML DOM не работают.

<?php
include "simple_html_dom.php";
function GetRWGames($rw_cat){
    $live = new simple_html_dom();
    $live->load_file("http://live.robinwidget.org/static/section" . $rw_cat . ".html");
    $data = $live->find(".lshpanel");
    $counter = 0;
    foreach($data as $game) {
        $games[$counter][cat] = $game->find(".section",0)->plaintext;
        $games[$counter][time] = $game->find(".date",0)->plaintext;
        $temp = $game->find(".lshevent",0)->plaintext;
        $temp = explode(" - ", $temp);
        $games[$counter][team1] = trim ($temp[0]);
        $games[$counter][team2] = trim ($temp[1]);
        $temp = $game->find("a");
        foreach ($temp as $a) {
            $a=$a->href;
            if(stristr($a, "javascript:openWindow")==true){
                $temp= strstr($a, "http");
                $temp= strstr($temp, '"',1);
                $games[$counter][links] .= $temp . ";";}
            elseif(!strpos($a,"adserving")&&!strpos($a,"adsrv")&&!empty($a))
            {$games[$counter][links] .= $a . ";";}
        }
        $counter++;
    }
    return $games;
}
$games = array();
// Load HTML from a string
$rw_cats = array(35,36,37,38,39,57,59);
foreach($rw_cats as $rw_cat){
print_r(GetRWGames($rw_cat));
}

Ошибка:
Fatal error: Uncaught Error: Call to a member function find() on null in D:\os\OpenServer\domains\newtest.ru\simple_html_dom.php:1113 Stack trace: #0 D:\os\OpenServer\domains\newtest.ru\index.php(7): simple_html_dom->find('.lshpanel') #1 D:\os\OpenServer\domains\newtest.ru\index.php(34): GetRWGames(36) #2 {main} thrown in D:\os\OpenServer\domains\newtest.ru\simple_html_dom.php on line 1113

Первая итерация проходит успешно, я получаю данные. Во второй итерации find перестает работать. При этом страницы вроде как загружаются, проверял просто загрузкой и выводом. Пробовал генерировать имя $live, вручную предоставлять объект simple_html_dom для обработки в $data, делал вовсе без циклов, вручную перебирая итерации. Постоянно ошибка на первом find.
  • Вопрос задан
  • 2165 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@vit134
почти та же проблема Call to a member function innertext() on null

function getContent($url) {
    $html = new simple_html_dom();
    $html->load_file($url);
    $html->save();

    $table = $html->find('table.tb-matches');

    foreach ($table as $key => $value) {
       foreach ($value->find('tr') as $key => $tr) {
            $elem =  $tr->find('td', 0);
            echo 'key' . $key . '<br>';
            echo 'tr' . $tr . '<br>';
            echo $tr->find('td', 0)->attr['colspan'] . '----<br>';
        }
    }

}
foreach ($dateArr as $key => $dateVal) { 
    getContent($url . $dateVal); 
}


пробовал после foreach ($table as $key => $value) { добавлять $value = new simple_html_dom();
ошибка стала появляться сразу, не выполняется даже первая итерация

UPD

решил проблему так: сначала добавляю контент всех страниц в переменную
foreach ($dateArr as $key => $dateVal) {
        $out .=  file_get_contents($url . $dateVal) ;
}

и потом создаю объект simple_html_dom
$html = new simple_html_dom();
    $html->load($out);
    $html->save();

    $table = $html->find('.list_table');

    foreach ($table as $key => $value) {
        $dd = $value->attr['date'];

        foreach ($value->find('table.tb-matches tr') as $key => $tr) {

            $elem =  $tr->find('td', 0);

            if ($elem->attr['colspan'] != '7') {
                $resultArr[$dd][] = array(
                    'time' => $tr->find('td', 0)->plaintext,
                    'home_team' => $tr->find('td.home-team', 0)->plaintext,
                    'away_team' => $tr->find('td.away_team', 0)->plaintext,
                    'status' => trim($tr->find('td.status', 0)->plaintext),
                    'score' => $tr->find('td.score', 0)->plaintext,
                    'href' => 'http://goal24.ru' . $tr->find('td.option a', 0)->href,
                );
            }
        }
    }


PS
Нашел еще один вариант решения

в функции которая гоняется в цикле, заменить $html = new simple_html_dom() на $html = str_get_html(file_get_contents($url)). Результат на лицо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
blrik
@blrik
Музыкант
Добавь $game = new simple_html_dom(); после foreach($data as $game)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы