4 место [Обзор]ZennoPoster + xPath на примере Яндекс.Маркета

DocSpoc

Client
Регистрация
04.01.2016
Сообщения
288
Благодарностей
169
Баллы
43

dtk77

Client
Регистрация
26.07.2017
Сообщения
24
Благодарностей
4
Баллы
3
// собрал коллекцию
HtmlElementCollection itemsCollection = tab.FindElementsByXPath("//div[@class='cabinet']");

HtmlElement item = itemsCollection.GetByNumber(3); // взял элемент из коллекции под №4

// тут хочу получить название из взятого элемента №4
HtmlElement nameItem = item.FindChildByXPath ("//div[@class='description']", 0);

// но вместо этого получаю название от элемента №1


Объясните пожалуйста, что я не правильно делаю.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
// собрал коллекцию
HtmlElementCollection itemsCollection = tab.FindElementsByXPath("//div[@class='cabinet']");

HtmlElement item = itemsCollection.GetByNumber(3); // взял элемент из коллекции под №4

// тут хочу получить название из взятого элемента №4
HtmlElement nameItem = item.FindChildByXPath ("//div[@class='description']", 0);

// но вместо этого получаю название от элемента №1


Объясните пожалуйста, что я не правильно делаю.
где то пролетало что FindChildByXPath не совсем корректно ищет.... возможно это и не так...
сделай лучше выбор элемента одним xpath. так надежнее и легче проверить в devtools
 

dtk77

Client
Регистрация
26.07.2017
Сообщения
24
Благодарностей
4
Баллы
3
У меня задача взять определённое объявление. Проверить его статусы и в случае соответствия кликнуть по кнопке поднять. Я вижу решение через коллекции и обращение свойствам элемента коллекции. Не совсем понял как сделать "одни xpath"
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
У меня задача взять определённое объявление. Проверить его статусы и в случае соответствия кликнуть по кнопке поднять. Я вижу решение через коллекции и обращение свойствам элемента коллекции. Не совсем понял как сделать "одни xpath"
не одни, а одним.
ну примерно так //div[@class='cabinet'][3]/div[@class='description']
это как пример, полный путь без документа сложно составить
вместо 3-ки подставить свою переменную при формировании пути
 

dtk77

Client
Регистрация
26.07.2017
Сообщения
24
Благодарностей
4
Баллы
3
не одни, а одним.
ну примерно так //div[@class='cabinet'][3]/div[@class='description']
это как пример, полный путь без документа сложно составить
вместо 3-ки подставить свою переменную при формировании пути
Спасибо за отклик,
Решил задачу через обращение к элементу в виде item.FindChildByAttribute

У меня при постановке переменной вместо 3ки ничего не происходит. Вероятно ошибка в синтаксисе
//div[@class='cabinet'][nomer]/div[@class='description'] Буду признателен, если укажите на ошибку
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Спасибо за отклик,
Решил задачу через обращение к элементу в виде item.FindChildByAttribute

У меня при постановке переменной вместо 3ки ничего не происходит. Вероятно ошибка в синтаксисе
//div[@class='cabinet'][nomer]/div[@class='description'] Буду признателен, если укажите на ошибку
C#:
int nomer = 3;
string xpath = "//div[@class='cabinet']["+nomer.ToString()+"]/div[@class='description']";
 
  • Спасибо
Реакции: dtk77

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 923
Благодарностей
1 123
Баллы
113
Подскажите пожалуйста как правильно составить запрос и сделать c# сниппет, сохраняющий результат в список, чтобы получить все характеристика товара, на примере: https://market.yandex.ru/product--protsessor-amd-ryzen-5-3600/508275153/spec?track=tabs
Там сейчас динамические классы, не как было раньше, но это не самое страшное спарсить можно, но нужно каждую инфу отдельно выпаршивать, весь список не получится сразу, либо как-то поделить.

//div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']
 
  • Спасибо
Реакции: timoxa949

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28
Там сейчас динамические классы, не как было раньше, но это не самое страшное спарсить можно, но нужно каждую инфу отдельно выпаршивать, весь список не получится сразу, либо как-то поделить.

//div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']
модицифицировал запрос таким образом:
//div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']/descendant::dt | //div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']/descendant::dd

парситса все, но в каждую новую строку.

Вопрос как сделать чтобы вывод был таким: Тактовая частота: 3600Мгц?

Или это уже штатными инструментами зенки? Спасибо

55728
 

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28
модицифицировал запрос таким образом:
//div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']/descendant::dt | //div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']/descendant::dd

парситса все, но в каждую новую строку.

Вопрос как сделать чтобы вывод был таким: Тактовая частота: 3600Мгц?

Или это уже штатными инструментами зенки? Спасибо

Посмотреть вложение 55728
Решился таким образом: //div[@data-apiary-widget-name = '@MarketNode/ProductSpecs']/descendant::dl

Подскажите пожалуйста как вывод сохранить в список?
 

timoxa949

Client
Регистрация
16.11.2018
Сообщения
158
Благодарностей
27
Баллы
28

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Очень нужно, хелп!
есть же действие - парсить данные по правой кнопке, там есть расширенная настройка и можно поставить свой xpath там же увидишь результат. ну и там есть возможность сразу в список это пихать.
Screen Shot 2020-05-14 at 21.36.30.png
 
  • Спасибо
Реакции: Seoandrii и timoxa949

Юра73

Client
Регистрация
23.05.2019
Сообщения
4
Благодарностей
0
Баллы
1
Подскажите, пожалуйста, как выбрать только определенную строку в узле и больше не брать дочерние html узлы:
<h1 class="title-section">Раскладной диван-кушетка Фантазия
<a href="/penza/mebelnaya-fabrika-stella-1845">
<span style="font-size: 14px; color: #aaa;">
<br class="xpather-highlight">г. Пенза</span></a>
<br class="xpather-highlight">Мебельная фабрика «Стелла»
</h1>
Страница: www.meb100.ru/livephoto/mebelnaya-fabrika-miks55/4491


В этом коде вторая строка не нужна <br class="xpather-highlight">Мебельная фабрика «Стелла»!
*//h1[@class='title-section']/a/span
У br нет закрывающего тега и тут я не знаю как?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Подскажите, пожалуйста, как выбрать только определенную строку в узле и больше не брать дочерние html узлы:
<h1 class="title-section">Раскладной диван-кушетка Фантазия
<a href="/penza/mebelnaya-fabrika-stella-1845">
<span style="font-size: 14px; color: #aaa;">
<br class="xpather-highlight">г. Пенза</span></a>
<br class="xpather-highlight">Мебельная фабрика «Стелла»
</h1>
Страница: www.meb100.ru/livephoto/mebelnaya-fabrika-miks55/4491


В этом коде вторая строка не нужна <br class="xpather-highlight">Мебельная фабрика «Стелла»!
*//h1[@class='title-section']/a/span
У br нет закрывающего тега и тут я не знаю как?
непонятно что надо взять. приведенный xpath выбирает 1 span. вроде все нормально. какая конечная цель и какие методы используются для ее достижения ?
 

Юра73

Client
Регистрация
23.05.2019
Сообщения
4
Благодарностей
0
Баллы
1
Нужно только взять - г. Пенза, без Мебельная Фабрика
 

Вложения

  • 276,9 КБ Просмотры: 178

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

Юра73

Client
Регистрация
23.05.2019
Сообщения
4
Благодарностей
0
Баллы
1
Да так работает.
Интересно, плагин XPath Helper Wizard - не видит элемента по этому пути,
а плагин XPather (https://github.com/Simek/XPather) видит
 

Вложения

  • 303,3 КБ Просмотры: 163

random.Object

Client
Регистрация
25.11.2020
Сообщения
9
Благодарностей
0
Баллы
1
Написал запрос http://joxi.ru/823P8dQc8aEYWA Выбираю экшн "Обработка текста". Далее {-Page.Dom-}. Далее во вкладке "Выбрать действия" пытаюсь найти Xpath, но такой опции нет. Как сохранить результаты парсинга в файл?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

Philipp

Client
Регистрация
14.10.2019
Сообщения
100
Благодарностей
55
Баллы
28
Тренируюсь в C# на примере этого шаблона, хочу написать парсер чтобы структуру каталогов собрать в один кубик, первые заголовки получилось собрать, но вот дальше ошибка, подскажите что не так.
Логика такая - беру батю и собираю все списки в коллекции внутри него, в каждой коллекции беру заголовок и ссылку, кладу всё это в ячейки по уровням
Примерно так кладу в таблицу Лвл1|Линк;Лвл2|Линк2;Лвл3|Линк3;Лвл4|Линк4 и т.д. покуда там ещё будут категории.

Все ошибки в строке 28
Сайт https://tur-eda.ru/

Подскажите пожалуйста что не так и как это реализовать

C#:
IZennoList ItemList = project.Lists["Категории"];
IZennoTable table = project.Tables["Таблица 1"];
//Получаем текущу активную вкладку
Tab tab = instance.ActiveTab;

string xpath = "/html[starts-with(@class,'bx-core')]/body[starts-with(@class,'app')]/div[starts-with(@class,'app__wrapper')]/div[starts-with(@class,'b-aside-menu')]/div[@class='b-aside-menu__content']/div[@class='b-aside-menu__navs']/div[@class='b-aside-menu__scroller']/div[@class='b-aside-menu__scroller-content-main-menu']/nav[starts-with(@class,'aside-nav-list')]/ul[1]/li[@class='is-has-child']";
//Соберем все наши элементы используя "//div[starts-with(@data-id, 'model-')]" - xPath запрос. Будьте внимальны и используйте FindElementsByXPath.
HtmlElementCollection itemsCollection = tab.FindElementsByXPath(xpath);
//Лайфхак. Раскомментировать (Чтобы проверить, работает ли xPath) можно отправить в лог информацию о текущем количестве элементов в коллекции
project.SendInfoToLog("Количество элементов на страничке = " + itemsCollection.Count().ToString(), true);

//начинаем перебирать сформированную коллекцию HtmlElement-ов
foreach(HtmlElement item in itemsCollection)
{
    //Обращаемся к каждому элементу, как к пездюку через точку.
    HtmlElement pathItem = item.FindChildByXPath("./a", 0);
    //ItemList.Add(pathItem.InnerText);
    string link = new Regex("(?<=href=\").*?(?=\">)").Match(pathItem.OuterHtml).Value;
    table.AddRow(pathItem.InnerText+"|"+link);
    HtmlElementCollection items2Collection = item.FindChildrenByXPath("./descendant::li");
   
    if {(items2Collection.Count > 0)
        foreach(HtmlElement item2 in items2Collection)
        {
            //Обращаемся к каждому элементу, как к пездюку через точку.
    HtmlElement pathItem2 = item2.FindChildByXPath("./a", 0);

    string link2 = new Regex("(?<=href=\").*?(?=\">)").Match(pathItem2.OuterHtml).Value;
    table.AddRow(pathItem.InnerText+"|"+link+";"+pathItem2.InnerText+"|"+link2);
        }
    }
}
 

YANKEES

Новичок
Регистрация
05.04.2016
Сообщения
18
Благодарностей
1
Баллы
3

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Плиз помогите, не могу заставить работать http://xpather.com/8cTCD236
в конструкторе работает а в зенке нет
спасибо
страница для парсинга
//h2[@class='panel-title']/i[contains(@class,'star')] и потом взять InnerText
 

YANKEES

Новичок
Регистрация
05.04.2016
Сообщения
18
Благодарностей
1
Баллы
3

YANKEES

Новичок
Регистрация
05.04.2016
Сообщения
18
Благодарностей
1
Баллы
3
строка поиска так выглядит
//h2[@class='panel-title', /i[contains(@class,'star')]]
иначе нацепляет кучу левых дивов
//h2[@class='panel-title']/i[contains(@class,'star')]
 

mr.green

Client
Регистрация
26.09.2019
Сообщения
211
Благодарностей
125
Баллы
43

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
Никого не смущает, что сравнение в корне не верное? Тут больше подходит parent и child.
Я так понимаю.
parent это только родительский узел элемента (т.е. на 1 уровень вверх), ancestor это самый верхний возможный узел ветки.
child это вложенный узел (т.е. на 1 уровень ниже), descendant это любой из узлов по ветке ниже без учета глубины вложенности.
 

mr.green

Client
Регистрация
26.09.2019
Сообщения
211
Благодарностей
125
Баллы
43
Я так понимаю.
parent это только родительский узел элемента (т.е. на 1 уровень вверх), ancestor это самый верхний возможный узел ветки.
child это вложенный узел (т.е. на 1 уровень ниже), descendant это любой из узлов по ветке ниже без учета глубины вложенности.
А я так.
ancestor это отец,дед,прадед, пра прадед....
descendant это сын,внук,правнук, пра правнук...
 
  • Спасибо
Реакции: trecho

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