Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа парсера с таблицами и массивами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Опрос
Эту обработку информации можно считать скоростной?
Для голосования и просмотра результатов опроса войдите или зарегистрируйтесь

> Описание: Делаем парсер с таблицами
Torres90
Отправлено: 20 Апреля, 2018 - 09:54:20
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Всем привет!
Занимаюсь написанием парсера и обработкой полученной информации.
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = file_get_contents('http://football2.psvb.ru/index11.php');
  3. $str = str_replace('<table class="robobet_psvb_table">','<table class="robobet_psvb_table" id="robobet_psvb_table"><thead></thead><tbody>', $str);
  4. $str = str_replace('</table>','</tbody></table>', $str);
  5. $ids = array('tabke' => 'id="robobet_psvb_table"');
  6. foreach ($ids as $k => $mark) {
  7. // Постепенно отсекаем лишнее, оставляя лишь содержимое <tbody>
  8. $table = strstr($str, $mark, false);
  9. $table = strstr($table, '</table>', true);
  10. $table = strstr($table, '</thead>', false);
  11. // Разбиваем по закрывающему тегу и не забываем удалить лишний кусок в конце.
  12. $cells = explode('</td>', $table, -1);
  13. // Удаляем html разметку и лишние пробелы по краям
  14. array_walk($cells, function(&$n) { $n = trim(strip_tags($n)); } );
  15. // Восстанавливаем структуру в 12 столбцов
  16. $result[$k] = array_chunk($cells, 12); }
  17. print_r($result);
  18.  

Через принт выводится сложный массив. Мне нужно вывести этот массив обратно в таблицу вида <table>, но только нужных мне столбцов, причем в нужном порядке. По этой таблице непонятно зачем мне это нужно, но есть проблемы с таблицами, где заполнены не все поля и этот способ должен их обработать.
Подскажите пожалуйста как правильно вывести нужную информацию.
 
 Top
Строитель
Отправлено: 20 Апреля, 2018 - 10:39:51
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Torres90, добавьте пожалуйста к вашему посту дамп массива и структуру html-таблицы.
 
 Top
Torres90
Отправлено: 20 Апреля, 2018 - 11:05:50
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




CODE (html):
скопировать код в буфер обмена
  1.  
  2. <table class="table table-bordered table-responsive table-hover">
  3.                 <thead class="table-active">
  4.                   <tr class="col-lg-12">
  5.                     <th scope="col">Дата</th>
  6.                     <th scope="col">Чемпионат</th>
  7.                     <th scope="col">Матч</th>
  8.                     <th scope="col">П1</th>
  9.                     <th scope="col">Х</th>
  10.                     <th scope="col">П2</th>
  11.                     <th scope="col">Прогноз</th>
  12.                     <th scope="col">П1</th>
  13.                     <th scope="col">Х</th>
  14.                     <th scope="col">П2</th>
  15.                   </tr>
  16.                 </thead>
  17.                 <tbody>
  18.                   Парсер, каждый массив второго уровня в td, основнной массив в tr обрамляется
  19.                 </tbody>
  20. </table>
  21.  


Дамп:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Array ( [tabke] => Array ( [0] => Array ( [0] => [1] => [2] => 2018-04-20 00:30 [3] => Чемпионат Сальвадора [4] => КД Драгон - Луис Анхель Фирпо [5] => 43% [6] => 28% [7] => 29% [8] => 12 [9] => 2.17 [10] => 3.10 [11] => 3.26 ) [1] => Array ( [0] => [1] => [2] => 2018-04-20 00:30 [3] => Чемпионат Гватемалы [4] => Антигуа ГФК - ФК Сухитепекес [5] => 74% [6] => 14% [7] => 12% [8] => П1 [9] => 1.26 [10] => 5.80 [11] => 8.00 ) [2] => Array ( [0] => [1] => [2] => 2018-04-20 01:00 [3] => Чемпионат Сальвадора [4] => Санта Текла II - Альянса II [5] => 27% [6] => 22% [7] => 51% [8] => 12 [9] => 3.44 [10] => 3.60 [11] => 1.82 )))
  3.  

В масиве 12 столбцов, первые два пустые, т.е. их не используем, остальные 10 как раз в поля должны зайти.

(Отредактировано автором: 20 Апреля, 2018 - 11:07:35)

 
 Top
Строитель
Отправлено: 20 Апреля, 2018 - 12:26:28
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Torres90 пишет:
В масиве 12 столбцов, первые два пустые, т.е. их не используем, остальные 10 как раз в поля должны зайти.
Пустые элементы можно отфильтровать с помощью array_filter(), а сбросить ключи - с помощью array_values(). Пример:

Спойлер (Отобразить)
Совет на будущее - для того, чтобы удобнее было с вашим дампом работать кому-то другому, публикуйте его с помощью var_export()
 
 Top
Torres90
Отправлено: 20 Апреля, 2018 - 12:33:05
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Строитель пишет:
Пустые элементы можно отфильтровать с помощью array_filter(), а сбросить ключи - с помощью array_values().

А если мне не нужно удалять пустые? В таблице могут быть изначально пустые поля, при парсере они тоже должны писаться в базу и заполняться также пустыми... Сейчас конкретно этого дампа, что я прислал надо просто вырезать первые 2 элемента в каждом подмассиве.

Строитель пишет:
Совет на будущее - для того, чтобы удобнее было с вашим дампом работать кому-то другому, публикуйте его с помощью var_export()

Я до сих пор не понял, что отменя требовалось при добавлении дампа...
 
 Top
Строитель
Отправлено: 20 Апреля, 2018 - 12:54:23
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Torres90 пишет:
Сейчас конкретно этого дампа, что я прислал надо просто вырезать первые 2 элемента в каждом подмассиве
Если фильтровать нельзя, тогда нужно выбирать срез массива array_slice(), таким образом отбрасывать первые два элемента в каждом массиве, чтобы получить необходимый размер.
Спойлер (Отобразить)

(Добавление)
Torres90 пишет:
Я до сих пор не понял, что отменя требовалось при добавлении дампа...
Просто распечатайте массив с помощью print_r(); и с помощью echo '<pre>', var_export($result), '</pre>'; и посмотрите, какую из полученных строк можно быстро скопировать и сохранить в переменную для дальнейшей работы с вашим массивом -- так вам станет понятнее.

(Отредактировано автором: 20 Апреля, 2018 - 13:23:14)

 
 Top
Torres90
Отправлено: 20 Апреля, 2018 - 13:55:12
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




К сожалению у меня не работает вывод. Связано ли это с тем, что информация в массив получается в этом же файле через file_get_contents или может слишком большой размер массива?
Имею ввиду, что из таблицы получаю массив в этом файле, а его сразу же извлекаем?

(Отредактировано автором: 20 Апреля, 2018 - 13:57:37)

 
 Top
Строитель
Отправлено: 20 Апреля, 2018 - 14:09:10
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Torres90, я на локальном сервере запускал ваш код, всё было ок. Включите отображение ошибок, может быть что-то прояснится.
 
 Top
Torres90
Отправлено: 21 Апреля, 2018 - 11:09:40
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Строитель, спасибо! Все отлично работает, особенно порадовал вывод столбцов в нужных местах! Вчера не получалось видимо из-за того, что правки все делал с телефона.

А есть какой-то способ при парсинге дамп этот записать в файл, чтоб брать данные со своего сервера или это лучше делать с MySQL? Хотелось бы максимально ускорить процесс получения данных, а обновление информации в файле возможно через крон настроить.

(Отредактировано автором: 21 Апреля, 2018 - 11:10:19)

 
 Top
Строитель
Отправлено: 21 Апреля, 2018 - 11:21:53
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Torres90 пишет:
А есть какой-то способ при парсинге дамп этот записать в файл, чтоб брать данные со своего сервера или это лучше делать с MySQL?
Конечно есть - вместо вывода в браузер сохраняйте массив хоть в файл, хоть в БД.
 
 Top
Torres90
Отправлено: 23 Апреля, 2018 - 09:15:47
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




В конец файла парсера вставил такой код:
PHP:
скопировать код в буфер обмена
  1. $fp = fopen("/parser/db.txt", "w+"); // Открываем файл в режиме записи 
  2. $rec = fwrite($fp, $result); // Запись в файл
  3. if ($rec) echo 'Данные в файл успешно занесены.';
  4. else echo 'Ошибка при записи в файл.';
  5. fclose($fp); //Закрытие файла

Естественно записи не происходит, что может быть тут не так. Файл перезаписываться должен при каждом запросе.
 
 Top
Строитель
Отправлено: 23 Апреля, 2018 - 09:30:53
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Torres90, у вас в переменной $result массив, поэтому перед записью его нужно обрабатывать serialize(), а после чтения преобразовывать обратно к массиву с помощью unserialize().
 
 Top
Torres90
Отправлено: 23 Апреля, 2018 - 09:53:46
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Строитель
PHP:
скопировать код в буфер обмена
  1. $fp = fopen("/parser/db.txt", "w+"); // Открываем файл в режиме записи 
  2. $rec_arr = serialize($result);
  3. $rec = fwrite($fp, $rec_arr); // Запись в файл
  4. if ($rec) echo 'Данные в файл успешно занесены.';
  5. else echo 'Ошибка при записи в файл.';
  6. fclose($fp); //Закрытие файла

Пока результат тот же... Права на текстовый файл 777. Путь до файла прямой прописан. Читать его буду в отдельном файле, этот будет исключительно автоматически обновлять информацию с полной перезаписью файла.
 
 Top
Строитель
Отправлено: 23 Апреля, 2018 - 21:18:40
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Скорее всего у вас ошибка из-за отсутствия директории. Я дописал проверку на существование директории, и её создание в случае отсутствия is_dir($dir) ?: mkdir($dir);, и запустил этот код на локалке - файл создан успешно, и сериализованный массив тоже в этот файл записан:
Спойлер (Отобразить)
 
 Top
Torres90
Отправлено: 24 Апреля, 2018 - 00:00:11
Post Id


Новичок


Покинул форум
Сообщений всего: 17
Дата рег-ции: Апр. 2018  


Помог: 0 раз(а)




Строитель, вставил код из примера все заработало, причина как я понял у меня в пути была. Изменил путь в своем, тоже заработало... Однако не понимаю почему прямой путь не заработал... Видимо прописывается не ссылкой как у меня.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB