Яндекс Маркет

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Не могу забрать значения текста с карточек товаров под ценой на Яндекс Маркете и сохранить в список.
zenno.jpg
Пробовал такое не помогает. Помогите кто может
Код:
Tab tab = instance.MainTab;
var ab = tab.MainDocument.FindElementsByXPath("//div[@class='n-snippet-card2__part n-snippet-card2__part_type_right']/div[1]/div[2]/div[1]')]");
foreach (var el in ab.Elements){
project.Lists["Под ценой"].Add(el.InnerText);
}
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
var el = instance.ActiveTab.FindElementByXPath("//div[contains(@class, 'product-delivery')]//div[contains(@class, 'info_type_pickup')]", 0);
if(!el.IsVoid)
    project.Lists["Под ценой"].Add(el.InnerText);
else
    project.SendWarningToLog("Под ценой ничего не найдено или путь к элементу не сработал!");
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Код:
var el = instance.ActiveTab.FindElementByXPath("//div[contains(@class, 'product-delivery')]//div[contains(@class, 'info_type_pickup')]", 0);
if(!el.IsVoid)
    project.Lists["Под ценой"].Add(el.InnerText);
else
    project.SendWarningToLog("Под ценой ничего не найдено или путь к элементу не сработал!");
Под ценой ничего не найдено или путь к элементу не сработал. Постоянно так.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Вы ищете в самой карточке товара. Не для всех они на Маркете есть. Например по запросу Двери при клике на товар сразу отправляет на сайт магазина т.к карточки нет. Может я неправильно выразился. Тогда получается - список категории. Как на фото. Версия не мобильная
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
по запросу "Двери" много результатов. какой брать?
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Например в Маркете вводите Двери Самара. Выскакивает перечень товаров. Под ценой текст
zenno.jpg
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Всех по порядку. Или сразу всех в список
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Код:
var hec = instance.ActiveTab.FindElementsByXPath("//div[contains(@class, 'delivery__info')]/span");
if(hec.Count() > 0)
{
    foreach(var el in hec)
    {
        project.Lists["Под ценой"].Add(el.InnerText);
    }
}
else
    project.SendWarningToLog("Под ценой ничего не найдено или путь к элементу не сработал!");
 
Последнее редактирование:

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Компиляция кода Ошибка в действии "CS1023" "Внедренный оператор не может быть объявлением или оператором с идентификатором". [Строка: 2; Cтолбец: 5]
Выполнение действия CSharp OwnCode. Последовательность не содержит соответствующий элемент
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
20:29:34 Выполнение действия CSharp OwnCode. Последовательность не содержит соответствующий элемент
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Последовательность не содержит соответствующий элемент
сниппет выходит по условию, а не по ошибке в случае если не найдены элементы. может что-то изменялось?
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Да нет вроде. В ПМ делаю
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Ладно. Спасибо что попытались помочь. Буду думать
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Ладно. Спасибо что попытались помочь. Буду думать
Можно собрать Regex'ом или X-path'ем по этому элементу:
Код:
//span[contains(@class, 'n-delivery__text')]
2019-08-29_22-51-32.png

Осталось правильные функции использовать ) Надеюсь поможет
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Ладно. Спасибо что попытались помочь. Буду думать
Я ошибился)) Не заметил сразу, что у некоторых товаров нет этого дива. Нужно идти сверху, по слоям товаров, и из них вытягивать. Если нет совпадения - присваивать пустое значение этой строке.
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Я ошибился)) Не заметил сразу, что у некоторых товаров нет этого дива. Нужно идти сверху, по слоям товаров, и из них вытягивать. Если нет совпадения - присваивать пустое значение этой строке.
Подсказать можете как такое правильно сделать? Потому что я с такой проблемой столкнулся и в обычном описании. Беру значения в список, т.к как товаров на странице по 48 то и значений должно быть 48. А бывает что Обычного описания 46 значений, а описания под ценой 43 и иногда первое значение Названия товара не берет - все перемешивается если потом построчно брать. Момент с пустыми строками не могу додуматься как реализовать, наверно что то с таблицами, пустые строки как правильно объявить чтоб создавало строку и пустое значение записывало, с таблицами вообще не работал, не приходилось?
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Подсказать можете как такое правильно сделать? Потому что я с такой проблемой столкнулся и в обычном описании. Беру значения в список, т.к как товаров на странице по 48 то и значений должно быть 48. А бывает что Обычного описания 46 значений, а описания под ценой 43 и иногда первое значение Названия товара не берет - все перемешивается если потом построчно брать. Момент с пустыми строками не могу додуматься как реализовать, наверно что то с таблицами, пустые строки как правильно объявить чтоб создавало строку и пустое значение записывало, с таблицами вообще не работал, не приходилось?
Извини, но я тебе дам полный ответ, не опираясь знаешь ты что-то уже - или нет.
1) Парсишь все карточки. Их на странице 48 штук (Можно определить по css-selector
Код:
div.n-snippet-card2__part.n-snippet-card2__part_type_right
или по x-path:
Код:
//div[contains(@class, 'n-snippet-card2__part n-snippet-card2__part_type_right')]
2) Видим, что у всех карточек есть внутренний div - с нужными тебе данными. x-path:
Код:
//div[@id='offer-nFkdRYf2OeCXB7K96n0HZg']/div[contains(@class, 'n-snippet-card2__part n-snippet-card2__part_type_right')]/div[contains(@class, 'n-snippet-card2__top')]
3) проверяем количество попаданий - отрезая в последнем коде всё, кроме крайнего последнего дива.
Код:
//div[contains(@class, 'n-snippet-card2__top')]
- 48 совпадений - парсим в все список.
2019-08-30_11-31-18.png

2019-08-30_11-33-07.png

4) Делаешь цикл обработки каждой строки списка по одной.
а) Берешь строку в переменную.
б) Обработка по regex для цены (первое совпадение со знаком рубля)
в) обработка по regex для доставки
г) для все остального, что ты хочешь вытянуть из этой лабуды.

Все результаты - в переменные; все эти переменные - по спискам.
Потом в результирующую таблицу каждый список как тебе нужно.

P.S. Прости, скрин проекта не смогу прикрепить, комп решил ребутнуться >_<
P.S.S. Реализация на C# для этого тоже возможна, но я особо ещё не въехал в него, кроме объявления, вытягивания и создания новых переменных и использования их в банальных конструкциях, поэтому её не будет))
 

Вложения

  • Спасибо
Реакции: Mebpuf

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Подсказать можете как такое правильно сделать? Потому что я с такой проблемой столкнулся и в обычном описании. Беру значения в список, т.к как товаров на странице по 48 то и значений должно быть 48. А бывает что Обычного описания 46 значений, а описания под ценой 43 и иногда первое значение Названия товара не берет - все перемешивается если потом построчно брать. Момент с пустыми строками не могу додуматься как реализовать, наверно что то с таблицами, пустые строки как правильно объявить чтоб создавало строку и пустое значение записывало, с таблицами вообще не работал, не приходилось?
Получилось? :-)
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Не подскажешь такое, есть путь XPath - //div[@class='first']/div[@class='second] . На странице именно таких 20 совпадений. Как брать каждый по порядку? Номер совпадения как правильно указывать?
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8
Мысль ясна. Но дело в том что не во всех товарах есть описание и способ доставки. В одних есть в других нет.
б) Обработка по regex для цены (первое совпадение со знаком рубля)
в) обработка по regex для доставки
г) для все остального, что ты хочешь вытянуть из этой лабуды.
С ценой понятно у нее маркер Руб. А остальное описание, название
не понятно как правильно разделять, по какому маркеру. При том что на картинке еще удачный поисковой запрос, где есть слово доставка, служба доставки и др. А есть запросы товара где такие слова не встречаются и не нужный текст лезет в наименование товара и оно становится огромным и нечитабельным, как пример.
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Мысль ясна. Но дело в том что не во всех товарах есть описание и способ доставки. В одних есть в других нет.

С ценой понятно у нее маркер Руб. А остальное описание, название
не понятно как правильно разделять, по какому маркеру. При том что на картинке еще удачный поисковой запрос, где есть слово доставка, служба доставки и др. А есть запросы товара где такие слова не встречаются и не нужный текст лезет в наименование товара и оно становится огромным и нечитабельным, как пример.
Уже пятница вечер) вернемся к этому чуть позже.
 

Mebpuf

Client
Регистрация
12.03.2019
Сообщения
48
Благодарностей
1
Баллы
8

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Мысль ясна. Но дело в том что не во всех товарах есть описание и способ доставки. В одних есть в других нет.

С ценой понятно у нее маркер Руб. А остальное описание, название
не понятно как правильно разделять, по какому маркеру. При том что на картинке еще удачный поисковой запрос, где есть слово доставка, служба доставки и др. А есть запросы товара где такие слова не встречаются и не нужный текст лезет в наименование товара и оно становится огромным и нечитабельным, как пример.
Сейчас постараюсь быстро нарисовать Всё :-) Поставил дома демку, но я тебе очень советую разобраться с регулярками. Потому что сейчас я получаю данные, которые отличаются от тех, что я вчера получил в Стандартной версии. Итак.

1) Вот например, у тебя есть 48 совпадений. Первым делом ты парсишь часть кода, в которой вся нужна инфа тебе лежит. Собираем 48 штук объектов
по regex в список:
Код:
(?<=<div\ class="n-snippet-card2__part\ n-snippet-card2__part_type_right">).*?(?=<div\ class="n-snippet-card2__bottom">)
2019-08-31_12-54-25.png
2019-08-31_13-03-55.png

2019-08-31_13-05-52.png
И записываем переменную в "Ещё более офигенный лист"

P.S. Я проверил лист, посмотрел, что там все ещё остались href, поэтому этот "Ещё более офигенный лист" обработал ещё раз regexом, который удалил всё, что идет после него из моих переменных.
Код:
href="//.*
2019-08-31_13-17-55.png

2) Смотрим какие у нас данные есть в этом списке.
- цена со скидкой + скидка;
- конечная цена продукта;
- есть доставка или цена доставки + сроки или на заказ или Бесплатная доставка;
- возможность самовывоза;
- возможность оплаты картой на сайте, наличными, предоплата;
P.S. переход в магаз и чат я опускаю - не информативно.

Берем строку из списка в переменную и составляем выражения для парсинга из переменной этих данных (обработка текста - {-variable.itemToProcess-} - Regex:
Код:
(?<=<span\ class="price\ price_unactual_yes">).*?(?=</span>)
//Цена без скидки, если есть скидка e.g. Старая цена. Если этого объекта нет - кладем пустую переменную
//newVar = oldPrice
Код:
(?<=<span\ class="sticker_type_discount__text">).*?(?=</span>)
//скидка, если она есть. если нет - кладем пустую переменную
//newVar = discount
Код:
(?<=<div\ class="price">).*?(?=</div>)
//Текущая цена с учетом скидки, либо без скидки
//newVar = realPrice
Код:
(?<=<span\ class="n-delivery__text">).*?(?=</span>)
//Инфо о доставке
//newVar = deliveryInfo
2019-08-31_13-34-34.png

3) Cобираю для 2го айтема - вижу, что результат "кривой", и не все данные вписаны
2019-08-31_13-41-52.png

Решение:
3a) создаю доп.проверку: если var deliveryInfo содержит внутри < и > - заменить всё, что между ними на пустоту.
Код:
//C# код для проверки

string vari = project.Variables["deliveryInfo"].Value;
if (vari.Contains("<span class=\"n-delivery__price\">"))
{
    return true;
}
else
{
    return null;
}
Код:
//regex для замены в переменной
//если есть - поменяется, если нет - красный вывод на следующий regex.
<span class="n-delivery__price">
3b) Новые недобавленные данные
Код:
//regex время доставки
(?<=<span\ class="n-delivery__time">,).*?(?=</span>)
Код:
//regex самовывоза
(?<=<div\ class="n-delivery__info\ n-delivery__info_type_pickup">).*?(?=</div>)
Добавляем их в таблицу.

4) 4 строки собрал - остановился на карточке с инфо об оплате. Нашел regex, спарсил в новую переменную, Добавил в таблицу
Код:
//var.payment
(?<=<div\ class="n-payment-type-hint\ n-payment-type-hint_text-color_muted">).*?(?=</div>)
5) Дошёл до 12 строки, появилась новая фича у delivery.Time. Обработка такая же как для deliveryInfo - с проверкой на текст
Код:
// C# для поиска фичи
string vari = project.Variables["deliveryTime"].Value;
if (vari.Contains("<span class=\"n-delivery__feature\">"))
{
    return true;
}
else
{
    return null;
}
Код:
//regex для поиска совпадения и замены на пустоту в переменной. Сохраняем в deliveryTime
<span class="n-delivery__feature">
Пруф изменений
2019-08-31_14-37-47.png

6) После этого я до конца списка запустил этот процесс парсинга, кубиками, потому что никак не могу впереть в лямбды и C#, но у меня все впереди.
А вот твоя табличка фоткой, которую ты получаешь в конце этих действий, и остается исправить ещё парочку regexov для переменных, где есть косяки. Но я на это уже убил 2 часа, поэтому переделывать - за тобой ))

Вперёд, мой юный падаван :-) Правда и мне до джедая далеко) Удачи) Посмотри курсы Rostonix'a )

2019-08-31_14-42-32.png
 

Вложения

  • Спасибо
Реакции: Mebpuf

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)