- Парсинг большой html таблицы в mysql
- Пример парсинга html-страницы на phpQuery
- Подготовка
- Включение вывода ошибок PHP:
- Локаль:
- Мета-теги
- Заголовок страницы (title)
- Результат:
- Keywords и Description
- Результат:
- Несколько элементов
- Результат:
- Заголовок h1
- Результат:
- Хлебные крошки
- Результат:
- Артикул
- Результат:
- Цены
- Результат:
- Изображения
- Результат:
- Списки dl dd dt
- Результат:
- Списки ul
- Результат:
- Таблицы
- Результат:
- Произвольный контент
- Результат:
- Парсинг таблицы
Парсинг большой 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'));
Мета-теги
Заголовок страницы (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
$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']);
Результат:
Изображения
Для оптимизации скорости, фото товаров в тегах уменьшают и оборачивают их ссылками на оригинальные изображения.
$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
Сложность парсинга списков определений заключается в том, что у нескольких
/* 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] => Два сингла и один хамбакер )
Таблицы
Найдем все
$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 [Колки] => хром [Ориентация] => для правшей [Цвета] => белый, темно-синий металлик, красный металлик, чёрный [Аксессуары в комплекте] => нет )
Произвольный контент
Найдем
$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.
Парсинг таблицы
Парсинг таблицы
Для парсинга я использую 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>