Не могу забрать значения текста с карточек товаров под ценой на Яндекс Маркете и сохранить в список.
Пробовал такое не помогает. Помогите кто может
Код:
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);
}
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("Под ценой ничего не найдено или путь к элементу не сработал!");
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("Под ценой ничего не найдено или путь к элементу не сработал!");
Вы ищете в самой карточке товара. Не для всех они на Маркете есть. Например по запросу Двери при клике на товар сразу отправляет на сайт магазина т.к карточки нет. Может я неправильно выразился. Тогда получается - список категории. Как на фото. Версия не мобильная
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("Под ценой ничего не найдено или путь к элементу не сработал!");
Компиляция кода Ошибка в действии "CS1023" "Внедренный оператор не может быть объявлением или оператором с идентификатором". [Строка: 2; Cтолбец: 5]
Выполнение действия CSharp OwnCode. Последовательность не содержит соответствующий элемент
Я ошибился)) Не заметил сразу, что у некоторых товаров нет этого дива. Нужно идти сверху, по слоям товаров, и из них вытягивать. Если нет совпадения - присваивать пустое значение этой строке.
Я ошибился)) Не заметил сразу, что у некоторых товаров нет этого дива. Нужно идти сверху, по слоям товаров, и из них вытягивать. Если нет совпадения - присваивать пустое значение этой строке.
Подсказать можете как такое правильно сделать? Потому что я с такой проблемой столкнулся и в обычном описании. Беру значения в список, т.к как товаров на странице по 48 то и значений должно быть 48. А бывает что Обычного описания 46 значений, а описания под ценой 43 и иногда первое значение Названия товара не берет - все перемешивается если потом построчно брать. Момент с пустыми строками не могу додуматься как реализовать, наверно что то с таблицами, пустые строки как правильно объявить чтоб создавало строку и пустое значение записывало, с таблицами вообще не работал, не приходилось?
Подсказать можете как такое правильно сделать? Потому что я с такой проблемой столкнулся и в обычном описании. Беру значения в список, т.к как товаров на странице по 48 то и значений должно быть 48. А бывает что Обычного описания 46 значений, а описания под ценой 43 и иногда первое значение Названия товара не берет - все перемешивается если потом построчно брать. Момент с пустыми строками не могу додуматься как реализовать, наверно что то с таблицами, пустые строки как правильно объявить чтоб создавало строку и пустое значение записывало, с таблицами вообще не работал, не приходилось?
Извини, но я тебе дам полный ответ, не опираясь знаешь ты что-то уже - или нет.
1) Парсишь все карточки. Их на странице 48 штук (Можно определить по css-selector
3) проверяем количество попаданий - отрезая в последнем коде всё, кроме крайнего последнего дива.
Код:
//div[contains(@class, 'n-snippet-card2__top')]
- 48 совпадений - парсим в все список.
4) Делаешь цикл обработки каждой строки списка по одной.
а) Берешь строку в переменную.
б) Обработка по regex для цены (первое совпадение со знаком рубля)
в) обработка по regex для доставки
г) для все остального, что ты хочешь вытянуть из этой лабуды.
Все результаты - в переменные; все эти переменные - по спискам.
Потом в результирующую таблицу каждый список как тебе нужно.
P.S. Прости, скрин проекта не смогу прикрепить, комп решил ребутнуться >_<
P.S.S. Реализация на C# для этого тоже возможна, но я особо ещё не въехал в него, кроме объявления, вытягивания и создания новых переменных и использования их в банальных конструкциях, поэтому её не будет))
Подсказать можете как такое правильно сделать? Потому что я с такой проблемой столкнулся и в обычном описании. Беру значения в список, т.к как товаров на странице по 48 то и значений должно быть 48. А бывает что Обычного описания 46 значений, а описания под ценой 43 и иногда первое значение Названия товара не берет - все перемешивается если потом построчно брать. Момент с пустыми строками не могу додуматься как реализовать, наверно что то с таблицами, пустые строки как правильно объявить чтоб создавало строку и пустое значение записывало, с таблицами вообще не работал, не приходилось?
Не подскажешь такое, есть путь XPath - //div[@class='first']/div[@class='second] . На странице именно таких 20 совпадений. Как брать каждый по порядку? Номер совпадения как правильно указывать?
б) Обработка по regex для цены (первое совпадение со знаком рубля)
в) обработка по regex для доставки
г) для все остального, что ты хочешь вытянуть из этой лабуды.
С ценой понятно у нее маркер Руб. А остальное описание, название
не понятно как правильно разделять, по какому маркеру. При том что на картинке еще удачный поисковой запрос, где есть слово доставка, служба доставки и др. А есть запросы товара где такие слова не встречаются и не нужный текст лезет в наименование товара и оно становится огромным и нечитабельным, как пример.
Мысль ясна. Но дело в том что не во всех товарах есть описание и способ доставки. В одних есть в других нет.
С ценой понятно у нее маркер Руб. А остальное описание, название
не понятно как правильно разделять, по какому маркеру. При том что на картинке еще удачный поисковой запрос, где есть слово доставка, служба доставки и др. А есть запросы товара где такие слова не встречаются и не нужный текст лезет в наименование товара и оно становится огромным и нечитабельным, как пример.
Мысль ясна. Но дело в том что не во всех товарах есть описание и способ доставки. В одних есть в других нет.
С ценой понятно у нее маркер Руб. А остальное описание, название
не понятно как правильно разделять, по какому маркеру. При том что на картинке еще удачный поисковой запрос, где есть слово доставка, служба доставки и др. А есть запросы товара где такие слова не встречаются и не нужный текст лезет в наименование товара и оно становится огромным и нечитабельным, как пример.
Сейчас постараюсь быстро нарисовать Всё Поставил дома демку, но я тебе очень советую разобраться с регулярками. Потому что сейчас я получаю данные, которые отличаются от тех, что я вчера получил в Стандартной версии. Итак.
1) Вот например, у тебя есть 48 совпадений. Первым делом ты парсишь часть кода, в которой вся нужна инфа тебе лежит. Собираем 48 штук объектов
по regex в список:
И записываем переменную в "Ещё более офигенный лист"
P.S. Я проверил лист, посмотрел, что там все ещё остались href, поэтому этот "Ещё более офигенный лист" обработал ещё раз regexом, который удалил всё, что идет после него из моих переменных.
Код:
href="//.*
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
3) Cобираю для 2го айтема - вижу, что результат "кривой", и не все данные вписаны
Решение:
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>)
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">
Пруф изменений
6) После этого я до конца списка запустил этот процесс парсинга, кубиками, потому что никак не могу впереть в лямбды и C#, но у меня все впереди.
А вот твоя табличка фоткой, которую ты получаешь в конце этих действий, и остается исправить ещё парочку regexov для переменных, где есть косяки. Но я на это уже убил 2 часа, поэтому переделывать - за тобой ))
Вперёд, мой юный падаван Правда и мне до джедая далеко) Удачи) Посмотри курсы Rostonix'a )