Основа работы с данными и ссылками в Датакол лежит в Xpath. Именно с помощью него, в большинстве случаев, мы подбираем ссылки на категории, товары, пагинацию, собираем данные со страницы. Есть конечно же и регулярные выражения, для более проблематичных случаев, но в большинстве случаев можно обойтись с помощью Xpath.
Сейчас я расскажу Вам некоторые тонкости и секреты в работе с Xpath которые помогут Вам в работе.
1. Нам нужно спарсить текст с тега у которого несколько классов или класс/id не постоянные. Например:
<h1 class"product_12345">Текст</h1>
Цифры в классе "product_12345" меняются в зависимости от страницы с товаров. Тогда нам поможет оператор contains:
//h1[contains(@class, 'product_')]
Этот оператор позволит искать не точное соответствие, а его вхождение. В кавычках указываем постоянную часть, в нашем случае 'product_'.
P.S после знака @ не обязательно должен быть id или class, вы можете использовать любой атрибут, который есть в теге. К примеру, если это ссылка, то можете также искать вхождение. Например:
http://site.com/catalog1/product_12345.html
Нам нужно собрать все ссылки у которых встречается "catalog1"
//a[contains(@href, 'catalog1')]
и также аналогично вы можете использовать любой другой атрибут тега: src, data-*, itemprop, alt ...
2. Нужно собрать данные с тега который НЕ содержит какйо-то атрибут. К примеру
<table class="table"> <tr> <td class="title">data1</td. <td>data2</td> </tr> </table>
Нужно взять данные data2, т.е с тегов td, которые не содержат class. В этом нам поможет оператор not:
//table//td[not(@class)]
т.е выберет все td у которых нет атрибута class
или
//table//td[not(@class, "title")]
если нужно привязаться к конкретному классу
3. Чтобы получить элемент по порядковому номеру нужно к xpath добавить номер элемента, например [2]. Рассмотрим пример
<ul> <li>значение 1</li> <li>значение 2</li> <li>значение 3</li> </ul>
Нам нужно взять второй li
//ul/li[2]
Если нужно взять последний элемент, то
//ul/li[last()]
4. Часто на сайтах встречается javascript пагинация. Датакол позволяет нам собирать данные в таким случае. Это делается с помощью сценария. Пример http://web-data-extractor.net/video-training/datacol-instruction-obrabotka-javascript-paginacii/
НО есть одно НО, не всегда есть ссылка на следующую страницу. Часто есть просто список страниц 1, 2, 3, 4, 5 ... и как нажать на следующую?
Как пример http://fedresurs.ru/messages/IsSearching
Суть решения состоит в определении текущего элемента и выборе следующего. Для этого применяем такую конструкцию:
//li[@class="active"]/following-sibling::li[1]/a
Разберем ее, мы берем текущий активный элемент, в данном случае у него class=active. Далее оператор following-sibling. Пример его использования можно посмотреть тут http://tinman.cs.gsu.edu/~raj/8711/sp04/xpath/Output_rus/example15.html
Если коротко, то он выбирает теги которые идут за текущим, li[1]/a указывает что это должен быть именно следующий (первый) тег li с вложенным тегом a.
5. Выбор элементов с привязкой к тексту. Это подходит к такому шаблону, параметр > значение, который часто применяется в интернет магазинах в характеристиках или в объявлениях. Возьмем к примеру Яндекс.Маркет, https://market.yandex.ru/product/14018528/spec
Скажем нам нужно получить значение параметра Тип, т.е "фитнес-браслет".
- открываем пикер
- кликаем левой кнопкой мыши на "фитнес-браслет", подберется xpath
- далее кликайте правой кнопкой мыши по тексту "Тип" и выбирайте "Привязка к соседним элементам" > "По тексту"
Получим xpath
//dl[dt[@class='product-spec__name']/span[@class='product-spec__name-inner']='Тип']//dd[@class='product-spec__value']/span[@class='product-spec__value-inner']
1) ='Тип', т.е если у тега есть текстовое значение, то можем к нему привязаться.
2) //dd, т.е нет привязки именно к следующему элементу, // означает что это может быть элемент любой вложенности
Приведу пример по проще
<div> <div class="name">Тип1</div> <span>Значение1</span> </div>
Xpath:
//div[div[@class="name"]='Тип1']
Также еще можем найти конкретное значение следующей конструкцией
//div[text() = 'Тип1']
6. Если вам нужно получить тег у которого есть определенный атрибут, например атрибут target
<div> <div class="name">Тип1</div> <span><a target="_blank" href="/link1.html">Значение1</a></span> <span><a href="/link2.html">Значение2</a></span> </div>
Тут вам поможет такой xpath
//a/@target
Так вы получите сслылку <a target="_blank" href="/link1.html">Значение1</a>
7. Встречаются сайты у которых одни и те же данные представлены в разной структуре. Например каталоги компаний, у одних стандартный шаблон, у других платный шаблон. Также может быть карточка товара, у одного товара обычная цены, у другого акционная.
Для этого в настройках поля Датакол, просто укажите несколько xpath, каждый с новой строки. Если Датакол не найдет первый, то перейдет ко второму.
P.S сначала Датакол ищет по xpath, затем по регулярным выражениям. Т.е если xpath несколько, то сначала переберет их, если не найдет совпадения, то затем перейдет к regex. В любом случае, он выдаст тот элемент, который совпадет первым.
P.P.S чтобы найти абсолютно все совпадения, поле нужно сделать статическим.
Думаю на первый раз хватит ) Задавайте свои вопросы/предложения в комментариях. Буду рад ответить.
если бы вы знали, сколько времени вы мне сейчас сэкономили!!!
Время это очень растяжимое понятие) Всегда рад помочь
Было бы круто, если бы Вы еще объяснили как сделать авторизацию на сайте через cookies.
Статья супер - очень помогла.
Готово - http://bestweb4u.net/cookies-in-datacol/
Спасибо. ПО поводу coockies - думаю сделаю на этой неделе материал, как это сделать
А есть в Datacol сортировка полей данный?
Можно воспользоваться моим плагином http://bestweb4u.net/sortirovka-poley-datacol/
Нет. Только с помощью плагина или динамического плагина. Возможно в дальнейшем сделаю дин плагин и напишу пост об этом
Спасибо. И как авторизироваться в Selector также было бы хорошо, а то пытаюсь зайти, а реакции никакой
В селекторе есть поле для cookie http://prntscr.com/eyrm3z
А в каком формате туда вводить информацию?
В таком же как и обычно вводится в настройках Датаокл или браузера, например:
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
Это Юзер-агент такое вводится. А вот как ввести данные, чтобы логин и пароль приняло?
Если вы используете стандартный загрузчик - то просто сделайте правильные cookies. Но учтите что не для всех сайтов можно по ним авторизоваться. Если используете браузер, то делайте сценарий с авторизацией.
Так вопрос то и был в этом - как правильно написать cookies
Очень часто при сборе товаров нужно парсить хлебные крошки - чтобы потом правильно расфасовать товары по категориям. В опенкарте последний пункт после / - без ссылки, не уникальный и не отражает категорию. Как в этих крошках парсить только те пункты, которые являются ссылками на категории?
//div[@class='breadcrumbs']/a[contains(@itemprop, 'url')]
не помогает.
например страница
http://bit.ly/2pot60h
В вашем примере последний пункт и так не является ссылкой, если вы собираете с //div[@class='breadcrumbs']/a то и не будет попадать
[…] Те кто не знаком с моим материалом по подбору xpath, рекомендую прочесть статью "Xpath в Datacol: продвинутый уровень. Часть 1". […]
Спасибо!
Подскажите пожалуйста по пагинации
//li[@class="active"]/following-sibling::li[1]/a - это нужно в сценарии использовать?
Да, в сценарии. Там же в примере написано.
У вас есть пример
Тип1
Значение1
Но как из этого кода отдельно вытащить Тип1
и отдельно Значение1
Пример как я сделал формулу
Название характеристики
{"//div[@class='name]"};
Значение характеристики
{ "//div/span"};
У меня получается что в название попадает вся строка и получается вот так
Тип1 Значение1
Покажите страницу откуда собрать нужно, так трудно ответить
Помогите пожалуйста с Xpath .
Интересует наименование товара и цена с http://nbparts18.ru/?do=main&id_cat=881&id_item=6013
Никак не разберусь с Xpatch уже 3ий день сижу... Помогите пожалуйста))
Сори, пропустил Ваш комент. Может будет полезно на будущее.([^<>]*?)-[^<>]*?
Для названия лучше использовать регулярку
Для цены можно поизвращаться с xpath
Ваша цена -
//div[text()='Ваша цена']/following-sibling::div[1]/span
Для других цен регулярки
Опт:[^<>]*?]*?>([^<>]*?)
Спец:[^<>]*?]*?>([^<>]*?)
МегаОпт:[^<>]*?]*?>([^<>]*?)
Просто супер! Много читала документации, но часть поняла только здесь) У меня к вам такой вопрос: А как забрать атрибуты которые оформлены в виде выпадающего списка? Например есть доступные цвета и размеры, хочется их прикрепить к списку. Заранее спасибо за ответ!
Перечитала и поняла - я наверно не точно описала задачу.. Эти атрибуты заранее неизвестны. Хотелось бы, чтобы они были в виде
Цвет:золотой,синий,красный
Модель:короткая,длинная
Такое возможно не указывая заранее привязку к тексту?
Вам и не нужна привязка. Указывайте xpath для одной записи и поле делайте статичным.
Обычно список это //select/option
Только подберите правильный xpath
Я так и делаю. Проблема в том, что у меня получается единый список в виде:
Зеленый,Красный,Синий,Кожа,Замша,Пояс,Без пояса.
Т.е. потом такое отделять только руками. А когда товаров 2000? )
Вопрос как раз в этом. Можно ли делать конкатенацию, чтобы соединить (поставить перед списком) название атрибута? Чтобы получилось как в первом сообщении?
цвет:золотой,синий,красный;модель:короткая,длинная;материал:кожа,замша
А я бы потом регуляркой при импорте обработала как надо)
Тогда только сразу получить все данные (весь список) и потом заменами убирать лишнее.
Очень жаль (.. Значит придется делать так.
Большое спасибо за помощь!
Доброе.
Огромное спасибо за блог. Для меня каждая страница оказалась полезной!
Вопрос к экспертам следующий. Как правильно собирать стоимость вариативных товаров?
То есть цена товара зависит от списка факторов.
Хотелось бы раскрыть 2 ситуации:
1. таблица цен грузится сразу со страницей
2. цена появляется при выборе параметра
Вот ссылки примеры.
https://medovkrym.ru/product/mjod-majskij-iz-kryma/
https://www.dobryj-pasechnik.ru/katalog/view/1.html
Заранее спасибо)
Тут одно правило - анализируем код страницы. Для этого нужно ориентироваться в html, js. В основном вариации цен есть уже в коде. В первом примере http://prntscr.com/l0djrd
В зависимости от того в каком виде нужно это собрать, нужно либо сразу все собрать и очистить заменами, либо подбирать диапазон.
Во втором случае лучше диапазонами, там все данные на виду http://prntscr.com/l0dk5h
Каких-то более конкретных советов дать сложно, все очень индивидуально.
Доброе.
Вы чуть выше и год назад помогли мне хорошим советом) Огромное Вам спасибо.
Вопрос все в туже степь)
Вариативный товар (https://www.dom-textilya.ru/catalog/postelnoe-bele/postelnoe_bele_valtery_cl_317/) при выборе размера меняется не только цена сверху, но и ттх сбоку. Есть ли примеры или мануал как такое правильно собирать?
Я задавал вопрос на офиц. форуме – да за доп. плату.
Хочу сам разобраться и научиться. Подкинете пример или может где есть статейка полезная?
Спасибо)
К сожалению такого нет, только так сказать опыт и знание html, js. На форуме я Вам и ответил ) Мое мнение, что в этом случае только писать плагин с отправкой POST запроса. У меня в таком тоже мало опыта, делал несколько раз, но там каждый случай разный и универсального нет.
Спасибо)
Привет, подскажи пожалуйста. Как объединить th и td из таблицы в одном Xpath https://prof.lv/en/buvmateriali/buvmateriali/celtniecibas-pleves/siltumnicas-pleves/p-135497-siltumnicas_pleve_uv_stabilizeta_divu_sezonu_0120_mm_gaisi_zila_600cm_600m2
Хочу добавить в описание к товару в таком виде:
Thickness (мм): 0,12
Width (m): 6
Length (m): 100
Weight kg/1m2: 110
Area (m2): 600
Отвечал Вам на форуме
Только составлять регулярки, вроде такого
<th class="hide_th_3">[^<>]*?</th>.*?<td class="hide_td_3">[^<>]*?</td>
Подскажите, пожалуйста, что делать, если загрузчик датакол, пикер и селектор загружают не всю страницу?
Пробовать плагин Хрома. Других вариантов нет. А XPATH подбирать в браузере Хром или Firefox