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

Из за чего не работает корректно парсинг?

Есть часть кода: Цикл массива
foreach (($table_header->children) as $num => $th_row)
не работает корректно. Необходима помощь в поиске ошибки. $numer['model'] присваивается вместо артикула наименование товара.
private function get_price($subcat){
        $sql_file = fopen('base.sql', 'a+');

        $path_to_images = __DIR__ . _DS_ ."catalog". _DS_ ;
        $manufacturer_id = 25;
        //Разбираем подкатегории на отдельные группы товаров
        //$table_of_goods - таблица товаров общая
        //$table_header, $table_body - заголовок и тело таблицы соответственно
        $table_of_goods = new simple_html_dom();

        $html_sub = file_get_html($this->link . $subcat);
       // $html_sub = str_get_html($html_sub);
        //var_dump(get_class($html_sub));
        $description = new simple_html_dom();
        //Получаем описание, полное для всех товаров (кроме характеристик)
        $description = $html_sub->find('dl.tabs')[0]->find('dd.selected')[0]->find('div.tab-content')[0];

        //$description = $html_sub->find('dl.tabs dd.selected div.tab-content')[0];
        $description = htmlspecialchars($description->plaintext);



        //echo "<HR>";

        $table_of_goods = $html_sub->find('div#modal_table table.mod_t')[0]->children;

        $table_header = $table_of_goods[0]->find('tr')[0];
        $table_body = $table_of_goods[1]->children;
        $numer = array();
        //Вытягиваем номера ячеек с необходимыми нам столбцами
        foreach (($table_header->children) as $num => $th_row) {
            //  echo "FIRST foreach<br>";
            //var_dump($th_row->plaintext);
            //var_dump($num);
            switch(trim($th_row->plaintext)){
                case 'Наименование':
               // case 'Наименование светильника':
                    $numer["name"] = $num;
                    break;
                case 'Фото':
                case 'Изображение':
                    $numer['image'] = $num;
                    break;
                case 'Артикул':
                    $numer['model'] = $num;
                    break;
            }

        }
        if (!(isset($numer['image']))){
            $numer['image'] = '-1';
            $image_path = $html_sub->find('div.product_info div.image div img')[0]->src;
        }
        //echo "<hr>";
        $rowspan = 1;
        //Вытягиваем изображение и информацию из ячеек данных

        foreach ($table_body as $table_line){
            // echo "second foreach<br>";
            //прогоняемся по всем элементам таблицы, вытаскиваем подкатегории 3 уровня и товары с их свойствами и картинками
            //var_dump($table_line->plaintext);
            $arr_of_tl = $table_line->children;
            if($rowspan == 1){
                $row_bool = 0;
            }
            else {
                $row_bool = 1;
                $rowspan--;
            }
            foreach ($arr_of_tl as $num => $value){
                //Сопоставляем ячейку с заголовком
                switch($num + $row_bool){

                    case $numer['image']: {
                        //Необходимо получить ячейку изображения и проверить его rowspan. записать его rowspan в отдельную переменную и если он не равен 1, то прибавлять +1 переменной num, чтобы
                        // не сбивался порядок ячеек в таблице при считывании данных.
                        if (isset($value->rowspan)) {
                            $rowspan = (int) $value->rowspan;
                            //var_dump($rowspan);
                        }
                        if (isset($value->find('img')[0])){
                            $image_path = $value->find('img')[0]->src;

              }//;

                        //var_dump($image_path);
                        // $image = file_get_contents($image_path);
                        // file_put_contents($image["tmp_name"], $path_to_images);
                        //$image_addr = $path_to_images . $image;
                    }
                        break;
                    case $numer['model']: $article = $value->plaintext;
                        break;
                    case $numer['name']: $name = $value->plaintext;
                        break;

                }



            }
      if(isset($article) && $article !== '' && $article !== '  ')
      {
        $arr = explode("/", $image_path); 
                $imagen = end(str_replace(" ","",$arr));
        //file_put_contents(__DIR__ . _DS_ . "catalog" . _DS_ . $imagen, $this->link . $image_path);
        file_put_contents( 'catalog\\' . $imagen, file_get_contents('http://tdme.ru' . $image_path));

        //INSERT INTO base (name, image, description, article) VALUES ('6', '1st Street', 'Los Angeles', 'Harry Monroe')
           //$parsed_string = 'UPDATE tdm_upload SET `name` = \'' . $name . '\' `image` = \'catalog/'.   $article .   '\' `description` = \''.   $description .   '\' WHERE `article` = \'' . $article . "'; \n";
      $parsed_string = 'INSERT INTO base (image, description, article) VALUES (\'catalog\\'.$imagen.'\', \''. $description .'\', \''.$article."'); \n";
            fwrite($sql_file, iconv("WINDOWS-1251", "UTF-8", "$parsed_string") ); 


      }
  • Вопрос задан
  • 322 просмотра
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
LenovoId
@LenovoId
svg, css,js
а просто использовать готовые библиотеки нельзя ?
вот сам парсер контента : https://code.google.com/archive/p/phpquery/
Ответ написан
another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2
Проверяйте после
foreach (($table_header->children) as $num => $th_row) {
            //  echo "FIRST foreach<br>";
            //var_dump($th_row->plaintext);
            //var_dump($num);
            switch(trim($th_row->plaintext)){
                case 'Наименование':
               // case 'Наименование светильника':
                    $numer["name"] = $num;
                    break;
                case 'Фото':
                case 'Изображение':
                    $numer['image'] = $num;
                    break;
                case 'Артикул':
                    $numer['model'] = $num;
                    break;
            }

        }

Что содержится в $numer (дамп) и смотрите, корректно ли все обрабатывается.
Дальше проходите к циклу foreach ($arr_of_tl as $num => $value) {...}
Внутри него тоже проверяйте данные, к примеру - $num и $value.

А вообще - не стоит велосипедить подобные конструкции, смотрите готовые пакеты и используйте их. Composer установить и подключить autoload - дело двух минут.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 дек. 2024, в 20:12
10000 руб./за проект
22 дек. 2024, в 19:47
3000 руб./за проект
22 дек. 2024, в 19:03
60000 руб./за проект