Парсинг html таблицы php

Парсинг большой html таблицы в mysql

Задача:
Имеется html таблица на удаленном ресурсе. нужно сделать парсинг td элементов этой таблицы в mysql.

table> tr>td>/td>td>/td>td>/td>td>/td>td>/td>/tr> . +1600 строк

Собственно для парсинга я использовал библиотеку simple_html_dom.php
Написал следующий скрипт:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
set_time_limit(300); require ('simple_html_dom.php'); $url = file_get_contents("http://site/region&type_export=table"); $html = str_get_html($url); foreach($html->find('tr') as $a){ if (@$a->find('td',0)->plaintext) { $cell1=mysql_real_escape_string(@$a->find('td',0)->plaintext); $cell2=mysql_real_escape_string($a->find('td',1)->plaintext); $cell3=mysql_real_escape_string($a->find('td',2)->plaintext); $ins="INSERT INTO `tabless`.`all` (`id`, `date`, `app_id`) VALUES ('$cell1', '$cell2', '$cell3')"; $query = mysql_query($ins); if(!$query){ die('error'); } } }

Вопрос:
Скрипт работает и пишет в базу данные. Но выполняется данный скрипт 140 секунд. это довольно много для меня. Я так полагаю отрабатывает долго из за str_get_html($url).
Возможно ли как то оптимизировать скрипт, что бы он выполнялся быстрее?
Спасибо!

Источник

Пример парсинга html-страницы на phpQuery

phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют манипулировать элементами HTML/XML и получать их содержимое.

В примерах используется страница карточки товара https://snipp.ru/demo/76/index.html, все спарсенные данные помещаются в общий массив $data .

Пример страницы товара в интернет-магазине

Подготовка

Включение вывода ошибок PHP:

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

Локаль:

setlocale(LC_ALL, 'ru_RU'); date_default_timezone_set('Europe/Moscow'); header('Content-type: text/html; charset=utf-8');
include_once __DIR__ . '/phpQuery.php'; $doc = phpQuery::newDocument(file_get_contents('https://snipp.ru/demo/76/index.html'));

Если кодировка сайта-донора отличается от вашей, возможно в спарсенных данных кириллица будет иероглифами. В таком случаи потребуется перекодировка, например:

$html = file_get_contents('https://snipp.ru/demo/76/index.html'); $html = iconv('utf-8//IGNORE', 'windows-1251//IGNORE', $html); include_once __DIR__ . '/phpQuery.php'; $doc = phpQuery::newDocument($html);

Подробнее в статье «Перекодировка текста UTF-8 и WINDOWS-1251». Ещё бывают случаи, когда file_get_contents возвращает полученный контент сжатый в GZIP, например: �mw�Ƒ0�����&IkAI��f��j4/

function getcontents($url) < $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $output = curl_exec($ch); curl_close($ch); return $output; >include_once __DIR__ . '/phpQuery.php'; $doc = phpQuery::newDocument(getcontents('https://snipp.ru/demo/76/index.html'));

Мета-теги

Пример кода head страницы

Заголовок страницы (title)

Метод find(‘selector’) находит элементы по селектору, далее вызывается функция pq() , которая возвращает объект найденного элемента (подобно $ в jquery). К этому объекту можно применить методы, например text() – получить текстовое содержимое элемента.

$entry = $doc->find('title'); $data['title'] = pq($entry)->text(); echo $data['title'];

Результат:

Пример магазина - Электрогитара синего цвета Yamaha Pacifica012

Keywords и Description

$entry = $doc->find('head meta[name="keywords"]'); $data['keywords'] = pq($entry)->attr('content'); echo $data['keywords']; $entry = $doc->find('head meta[name="description"]'); $data['description'] = pq($entry)->attr('content'); echo $data['description'];

Результат:

Электрогитара,Yamaha,Pacifica012 Интернет-магазин цифровой и бытовой техники

Несколько элементов

$data['css'] = array(); $entry = $doc->find('head link[rel="stylesheet"]'); foreach ($entry as $row) < $data['css'][] = pq($row)->attr('href'); > print_r($data['css']);

Результат:

Array ( [0] => style.css [1] => https://snipp.ru/cdn/fontawesome/5.11.2/css/all.css )

Заголовок h1

Заголовок h1 в исходном коде страницы

$entry = $doc->find('h1'); $data['h1'] = pq($entry)->text(); echo $data['h1'];

Результат:

Электрогитара синего цвета Yamaha Pacifica012

Хлебные крошки

Хлебные крошки - вид на сайте

Хлебные крошки в исходном коде страницы

$data['breadcrumbs'] = array(); $entry = $doc->find('.breadcrumbs li a'); foreach ($entry as $row) < $ent = pq($row); $name = $ent->text(); $url = $ent->attr('href'); $data['breadcrumbs'][$name] = $url; > print_r($data['breadcrumbs']);

Результат:

Array ( [Аудио] => /audio/ [Музыкальные инструменты] => /audio/instruments/ [Гитары и аксессуары] => /audio/instruments/guitar/ [Yamaha] => /audio/instruments/guitar/yamaha )

Артикул

Артикул - вид на сайте

Артикул в исходном коде страницы

В данном случаи нужно только значение, c помощью метода remove() удаляется элемент с текстом «Артикул».

$entry = $doc->find('.prod .prod-sku'); $entry->find('span')->remove(); $data['sku'] = trim(pq($entry)->text()); echo $data['sku'];

Результат:

Цены

Цены - вид на сайте

Цены в исходном коде страницы

Цены выводятся с форматированием, его можно удалить регулярным выражением и привести значение к типу float или сразу применить PHP-функцию clean_price().

/* Старая цена - strike */ $entry = $doc->find('.price-price strike'); $val = pq($entry)->text(); $data['price_old'] = floatval(mb_ereg_replace('[^0-9.,]', '', $val)); var_dump($data['price_old']); /* Старая цена - span */ $entry = $doc->find('.price-price span'); $val = pq($entry)->text(); $data['price'] = floatval(mb_ereg_replace('[^0-9.,]', '', $val)); var_dump($data['price']);

Результат:

Изображения

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

Читайте также:  Php символы заглавными буквами

Изображения - вид на сайте

Изображения в исходном коде страницы

$data['images'] = array(); $entry = $doc->find('.prod-left img'); foreach ($entry as $row) < $link = pq($row)->parents('a'); $data['images'][] = pq($link)->attr('href'); > print_r($data['images']);

Результат:

Array ( [0] => /demo/76/Yamaha-1.jpg [1] => /demo/76/Yamaha-2.jpg [2] => /demo/76/Yamaha-3.jpg [3] => /demo/76/Yamaha-4.jpg )

Списки dl dd dt

Список dl - вид на сайте

Список dl dd dt в исходном коде страницы

Сложность парсинга списков определений заключается в том, что у нескольких

и может быть один контейнер . Решение – по отдельности спарсить все dt и dd и слить их в один массив функцией array_combine() .
/* dt */ $dt = array(); $entry = $doc->find('dl dt'); foreach ($entry as $row) < $dt[] = trim(pq($row)->text(), ':'); > /* dl */ $dd = array(); $entry = $doc->find('dl dd'); foreach ($entry as $row) < $dd[] = pq($row)->text(); > $data['attrs'] = array_combine($dt, $dd); print_r($data['attrs']);

Результат:

Array ( [Товара в наличии] => 14шт [Доставка] => завтра [Гарантия] => 12 мес. [Страна-производитель] => Индонезия )

Списки ul

Список - вид на сайте

Маркированный список в исходном коде страницы

$data['list'] = array(); $entry = $doc->find('ul.features li'); foreach ($entry as $row) < $data['list'][] = pq($row)->text(); > print_r($data['list']);

Результат:

Array ( [0] => Универсальная шестиструнная электрогитара серии Pacifica [1] => Корпус superstrat из агатиса [2] => Кленовый гриф с палисандровой накладкой [3] => Тремоло-бридж Vintage Tremolo [4] => 22 лада [5] => Хромированные колки [6] => Два сингла и один хамбакер )

Таблицы

Таблица - вид на сайте

Таблица в исходном коде страницы

Найдем все

в таблице, далее в цикле найдем в них ячейки по порядковым номерам с помощью селекторов td:eq(0) и td:eq(1) .
$data['table'] = array(); $entry = $doc->find('table.base-table tr'); foreach ($entry as $row) < $row = pq($row); $name = $row->find('td:eq(0)')->text(); $value = $row->find('td:eq(1)')->text(); $data['table'][$name] = $value; > print_r($data['table']);

Результат:

Array ( [Тип] => электрогитара [Материал корпуса] => агатис [Количество струн] => 6 [Тип корпуса] => superstrat [Материал грифа] => клён [Накладка грифа] => палисандр [Радиус накладки грифа] => 350 мм [Мензура] => 648 мм (25,5’’) [Бридж] => Vintage Tremolo, тремоло, хромированный [Лады] => 22 [Звукосниматели] => 2 сингла у грифа и в средней позиции + хамбакер у бриджа [Снятие] => HSS [Колки] => хром [Ориентация] => для правшей [Цвета] => белый, темно-синий металлик, красный металлик, чёрный [Аксессуары в комплекте] => нет )

Произвольный контент

Описание - вид на сайте

Текст с разметкой в исходном коде страницы

Найдем

, удалим из него заголовок и получим html-содержимое.
$entry = $doc->find('div.text'); $entry->find('h2')->remove(); $data['text'] = pq($entry)->html(); echo $data['text'];

Результат:

 

Разработанная на основе модели Pacifica 112, новая, еще более доступная по цене модель 012 характеризуется аналогичными контурами корпуса, мощным хамбакером в бриджевой позиции и 2 синглами, обеспечивающими чистое звучание. Гитара оснащена удобным грифом, 5-позиционным переключателем выбора звукоснимателей и тремоло типа Vintage.

Корпус: агатис. Гриф: привинченный, клен. Накладка грифа: сонокелинг, радиус 350 мм. Лады: 22. Мензура: 648 мм. Звукосниматель: 2 сингла, 1 хамбакер. Регуляторы: 5-позиционный переключатель звукоснимателей, мастер-громкость, тембр. Бридж: тремоло типа Vintage.

Источник

Читайте также:  Javascript как включить код

Парсинг таблицы

Парсинг таблицы
Для парсинга я использую file_get_contents На сайте есть таблица. Как мне каждую строку.

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

Парсинг определенных частей таблицы
Я хотел бы разместить на своем сайте информацию о со кланах онлайн игры, которые он-лайн. Для этого.

Парсинг данных из html-таблицы
Добрый вечер! Прошу помочь разобраться в парсинге данных из html таблицы <tr> <th.

 $tmp=file_get_contents("page.html"); for ($i=1;$i100;$i++) { $chto="Замена ".$i; $tmp = ereg_replace("$i", $chto, $tmp); } echo $tmp; ?>

Замена 1 Замена 2 Замена 3 Замена 4 Замена 5 Замена 6 Замена 7 Замена 8 Замена 9 Замена Замена 10
Замена 1Замена 1 Замена 1Замена 2 Замена 1Замена 3

Добавлено через 3 минуты
В принципе тоже самое но в другой кодировке.

ЦитатаСообщение от ICEBERG@ Посмотреть сообщение

можно попробывать присвоить уникльный id етим елементам

ЦитатаСообщение от ICEBERG@ Посмотреть сообщение

Заменять ничего не нужно. По крайней мере пока. Есть таблица, нужно взять данные из этой таблицы так что бы потом с ними можно было проделывать разные арифметические операци. Таблица разумеется не такая как у меня. Много текстов вокруг и нужно взять именно таблицу отрезав все лишнее. Кодов в нете много но все устарели и скрипты не работают, а править сам пока не умею. Поэтому хочу с ноля посмотреть как это происходит на примере простой таблицы.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
 html> head> meta http-equiv="Content-Type" content="text/html; charset=utf-8"> title>Таблица/title> /head> body> p>бла бла бла./p> table width="200" border="0"> tr> td>1/td> td>2/td> td>3/td> td>4/td> td>5/td> td>6/td> td>7/td> td>8/td> td>9/td> td>10/td> /tr> tr> td>11/td> td>12/td> td>13/td> td>14/td> td>15/td> td>16/td> td>17/td> td>18/td> td>19/td> td>20/td> /tr> tr> td>21/td> td>22/td> td>23/td> td>24/td> td>25/td> td>26/td> td>27/td> td>28/td> td>29/td> td>30/td> /tr> tr> td>31/td> td>32/td> td>33/td> td>34/td> td>35/td> td>36/td> td>37/td> td>38/td> td>39/td> td>40/td> /tr> tr> td>41/td> td>42/td> td>43/td> td>44/td> td>45/td> td>46/td> td>47/td> td>48/td> td>49/td> td>50/td> /tr> tr> td>51/td> td>52/td> td>53/td> td>54/td> td>55/td> td>56/td> td>57/td> td>58/td> td>59/td> td>60/td> /tr> tr> td>61/td> td>62/td> td>63/td> td>64/td> td>65/td> td>66/td> td>67/td> td>68/td> td>69/td> td>70/td> /tr> tr> td>71/td> td>72/td> td>73/td> td>74/td> td>75/td> td>76/td> td>77/td> td>78/td> td>79/td> td>80/td> /tr> tr> td>81/td> td>82/td> td>83/td> td>84/td> td>85/td> td>86/td> td>87/td> td>88/td> td>89/td> td>90/td> /tr> tr> td>91/td> td>92/td> td>93/td> td>94/td> td>95/td> td>96/td> td>97/td> td>98/td> td>99/td> td>100/td> /tr> /table> p>бла бла бла./p> /body> /html>

Источник

Оцените статью