Элементы таблицы очистки веб-страниц - ошибка Uncaught - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь очистить данные с веб-сайта, используя Simple HTM DOM и PHP

Веб-сайт: http://portal.chmi.cz/aktualni-situace/aktualni-stav-pocasi/ceska-republika/stanice/profesionalni-stanice/tabulky/teplota

Но мой код не работает, я получил фатальную ошибку. Кто-нибудь может мне помочь?

Ошибка:

Неустранимая ошибка: необученная ошибка: вызов функции-члена find () для массива в C: \ xampp \ htdocs \ simple_dom \ index.php: 20 Трассировка стека: # 0 {main} добавляется в C: \ xampp \ htdocs \ simple_dom \ index.php в строке 20

Мой код:

<?php
      include('simple_html_dom.php');

      $html = file_get_html('http://portal.chmi.cz/aktualni-situace/aktualni-stav-pocasi/ceska-republika/stanice/profesionalni-stanice/tabulky/teplota',false);

      $table = $html->find('table');
      $Data = array();

      foreach($table->find('tr[class=portlet-table-alternate]') as $row) {

          $rowData = array();

              foreach($row->find('td') as $cell) {

                  $rowData[] = $cell->innertext;
                  }

          $Data[] = $rowData;
      }
      print_r($Data);
?>

1 Ответ

0 голосов
/ 23 мая 2019

Ошибка говорит вам точно, в чем проблема.Вы получаете array как ответ file_get_html function.В следующей строке, когда вы вызываете

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

, вы пытаетесь вызвать метод find вашего array, который нарушает правила PHP.Вам нужно будет узнать, почему вы получаете array, каково его содержимое.Интуитивно, я думаю, вы получите array, где один из элементов (возможно, с индексом 0) содержит искомый элемент.Поэтому вам нужно будет изучить ваш array.Если это ошибка, тогда вы сделаете успешный шаг вперед, понимая природу вашей проблемы.Если это результат с полезным атрибутом, то вы сможете его использовать.Для большей справки, реализация file_get_html:

/**
 * All of the Defines for the classes below.
 * @author S.C. Chen <me578022@gmail.com>
 */
define('HDOM_TYPE_ELEMENT', 1);
define('HDOM_TYPE_COMMENT', 2);
define('HDOM_TYPE_TEXT',    3);
define('HDOM_TYPE_ENDTAG',  4);
define('HDOM_TYPE_ROOT',    5);
define('HDOM_TYPE_UNKNOWN', 6);
define('HDOM_QUOTE_DOUBLE', 0);
define('HDOM_QUOTE_SINGLE', 1);
define('HDOM_QUOTE_NO',     3);
define('HDOM_INFO_BEGIN',   0);
define('HDOM_INFO_END',     1);
define('HDOM_INFO_QUOTE',   2);
define('HDOM_INFO_SPACE',   3);
define('HDOM_INFO_TEXT',    4);
define('HDOM_INFO_INNER',   5);
define('HDOM_INFO_OUTER',   6);
define('HDOM_INFO_ENDSPACE',7);
define('DEFAULT_TARGET_CHARSET', 'UTF-8');
define('DEFAULT_BR_TEXT', "\r\n");
define('DEFAULT_SPAN_TEXT', " ");
define('MAX_FILE_SIZE', 600000);
// helper functions
// -----------------------------------------------------------------------------
// get html dom from file
// $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1.
function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
{
    // We DO force the tags to be terminated.
    $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
    // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
    $contents = file_get_contents($url, $use_include_path, $context, $offset);
    // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
    //$contents = retrieve_url_contents($url);
    if (empty($contents) || strlen($contents) > MAX_FILE_SIZE)
    {
        return false;
    }
    // The second parameter can force the selectors to all be lowercase.
    $dom->load($contents, $lowercase, $stripRN);
    return $dom;
}

EDIT

Оказывается, ошибка произошла в строке foreach, вызывая метод пустого array,Аккуратный и элегантный способ сделать это foreach - определить помощника function:

function myFind($input, $what) {
    if (!is_array($input)) {
        return $input->find($what);
    }
    $result = [];
    foreach ($input as $element) {
        $found = $element->find($what);
        foreach ($found as $f) $result[]=$f;
    }
    return $result;
}

and then call this like:

foreach(myFind($table, 'tr[class=portlet-table-alternate]') as $row) {
    //...
}
...