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

Tnyrtin

Client
Регистрация
12.05.2015
Сообщения
73
Благодарностей
8
Баллы
8
Спасибо большое.
 

Tnyrtin

Client
Регистрация
12.05.2015
Сообщения
73
Благодарностей
8
Баллы
8
Подскажите пожалуйста как правильно тут сделать. Получаю ошибку http://joxi.ru/l2ZxLedC0aqRrJ
 

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
Подскажите пожалуйста как правильно тут сделать. Получаю ошибку http://joxi.ru/l2ZxLedC0aqRrJ
На 10 строке ошибка, у вас получается два корневых запроса их нельзя объединять, если вы ищите пизд*ка, через метод FindChildByXPath необходимо использовать ./ в начале запроса.

Также для проверки правильности запроса, возьмите запрос со 2 строчки
и продолжите его запросом с 10 строчки
.

Получится

и посмотрите что выдаст xPather
Ну а далее шлифуйте запрос до тех пор, пока у вас не будет получен результат :bt:
 

dimytr

Client
Регистрация
30.03.2016
Сообщения
16
Благодарностей
6
Баллы
3
Отличная статья. Добавил в evernote.
 
  • Спасибо
Реакции: Sz5

kagorec

Client
Регистрация
24.08.2013
Сообщения
994
Благодарностей
540
Баллы
93
Наглядный пример как надо упоминать о своей статье в подписи.
Очень полезная статья.
 
  • Спасибо
Реакции: Sz5

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
Вот и настал день голосования:do:
vote.jpg
 

zagrenat

Client
Регистрация
02.11.2010
Сообщения
8
Благодарностей
2
Баллы
3
Sz5 громадное спасибо, очень помог этой статьей, плюс за то что помог чуть подправить под меня . замечательная статья буду изучать долго и упорно.
 
  • Спасибо
Реакции: Sz5

ERNEST

Новичок
Регистрация
22.05.2017
Сообщения
1
Благодарностей
1
Баллы
3
Автор Иисус, спасибо ему, очень выручил в нелегком труде изучения XPath! Попозже дополню пост:eek:
 
  • Спасибо
Реакции: Sz5

punipula

Client
Регистрация
19.10.2012
Сообщения
12
Благодарностей
1
Баллы
3
Лучшая статья! Спасибо за потраченное время!
 
  • Спасибо
Реакции: Sz5

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
Спасибо всем за фидбек :dn: обязательно приму участие в следующем конкурсе, будет уже без обзора инструментов ZP, но расскажу, каким образом можно заработать деньжат используя ZennoPoster :do:
 

sergej_g

Client
Регистрация
29.11.2011
Сообщения
151
Благодарностей
124
Баллы
43
добрые люди подскажите пжл - а если контент появляется при прокрутки страницы - что нужно добавить в код?
сначало нужно полностью чтобы подгрузилась станица? как пример www_cosmo.ru/beauty/ там страниц 30-50
Попробуйте так. Нашел на просторах форума.
 

Вложения

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

IH4w6UuEMt

Client
Регистрация
01.09.2010
Сообщения
34
Благодарностей
1
Баллы
8
Добрый! Получаю страницу, там изображений разное количество от 1 до 20 ти - string postImg1 = post.FindChildByXPath(".//div/div/img",0).GetAttribute("src").Trim();

Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        string postImg1 = post.FindChildByXPath(".//div/div/img",0).GetAttribute("src").Trim();
        string postLog = string.Format("{0};{1}",postTitle,postImg1);
        project.SendInfoToLog(postLog, true);      
        ItemList.Add(postLog);
}
У меня вопрос, а как вывести весь массив с картинками? Он берет первый элемент по умолчанию я так понимаю? Или надо подсчитывать количество элементов и цикл организовывать на вывод элементов ? Или другие пути есть?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Добрый! Получаю страницу, там изображений разное количество от 1 до 20 ти - string postImg1 = post.FindChildByXPath(".//div/div/img",0).GetAttribute("src").Trim();

Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        string postImg1 = post.FindChildByXPath(".//div/div/img",0).GetAttribute("src").Trim();
        string postLog = string.Format("{0};{1}",postTitle,postImg1);
        project.SendInfoToLog(postLog, true); 
        ItemList.Add(postLog);
}
У меня вопрос, а как вывести весь массив с картинками? Он берет первый элемент по умолчанию я так понимаю? Или надо подсчитывать количество элементов и цикл организовывать на вывод элементов ? Или другие пути есть?
Так у тебя В каждом post столько картинок. Или на странице такое количество блоков post находит, где в каждом по 1 картинке?
Для первого варианта надо сделать поиск не первого элемента postImg1, а всей коллекции и в цикле перепарсить ее (еще один внутренний foreach).
Для второго варианта все проще. Просто в новый список надо ложить каждое найденное значение.
Уточни ситуацию и приведу код, если сам не можешь.
 

IH4w6UuEMt

Client
Регистрация
01.09.2010
Сообщения
34
Благодарностей
1
Баллы
8
Так у тебя В каждом post столько картинок. Или на странице такое количество блоков post находит, где в каждом по 1 картинке?
Для первого варианта надо сделать поиск не первого элемента postImg1, а всей коллекции и в цикле перепарсить ее (еще один внутренний foreach).
Для второго варианта все проще. Просто в новый список надо ложить каждое найденное значение.
Уточни ситуацию и приведу код, если сам не можешь.
В одном посте от 1 до 20 ти картинок, только вникаю в C#, поэтому не знаю как правильно сделать, получается надо подсчитать количество картинок и организовать внутренний цикл по условию а в конце выводить в один список
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        HtmlElementCollection postImgAll = item.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
          var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
           foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
             {
              string temp = Img.GetAttribute("src").Trim(); // вытягивает src
              postImgAll_src.Add(temp); // кладем src в список
             }
        string postLog = string.Format("{0};{1}",postTitle,postImg1);
        project.SendInfoToLog(postLog, true);     
        ItemList.Add(postLog);
}
Проверь код, а то может я где не то прописал, нету на чем оттестировать.
Ну и чтобы делать в зенке чудеса придется вникать. Я не кодер, но по кусочкам готовых решений из форума\гугла могу сложить под себя хороший C#-снипет.
 

IH4w6UuEMt

Client
Регистрация
01.09.2010
Сообщения
34
Благодарностей
1
Баллы
8
Спасибо вот код работает
Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
          var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
           foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
             {
              string temp = Img.GetAttribute("src").Trim(); // вытягивает src
              postImgAll_src.Add(temp); // кладем src в список
             }
        string postLog = string.Format("{0};{1}",postTitle,postImgAll);
        project.SendInfoToLog(postLog, true);  
        ItemList.Add(postLog);
}
Список добавил в него парсятся src картинок, а вот как положить в изначальный список?

Получается я вставляю как то неправильно вот так

Код:
string postLog = string.Format("{0};{1}",postTitle,postImgAll);
        project.SendInfoToLog(postLog, true);  
        ItemList.Add(postLog);
В результате список содержит
Код:
Нужное Значение;ZennoLab.CommandCenter.HtmlElementCollection
ZennoLab.CommandCenter.HtmlElementCollection А это список с изображениями получается.

Т.е. строку добавить типа берем из списка, вытягиваем в строку и кладем в первоначальное значение переменной postImg1 ? Так можно как то сделать?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Спасибо вот код работает
Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
          var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
           foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
             {
              string temp = Img.GetAttribute("src").Trim(); // вытягивает src
              postImgAll_src.Add(temp); // кладем src в список
             }
        string postLog = string.Format("{0};{1}",postTitle,postImgAll);
        project.SendInfoToLog(postLog, true); 
        ItemList.Add(postLog);
}
Список добавил в него парсятся src картинок, а вот как положить в изначальный список?

Получается я вставляю как то неправильно вот так

Код:
string postLog = string.Format("{0};{1}",postTitle,postImgAll);
        project.SendInfoToLog(postLog, true); 
        ItemList.Add(postLog);
В результате список содержит
Код:
Нужное Значение;ZennoLab.CommandCenter.HtmlElementCollection
ZennoLab.CommandCenter.HtmlElementCollection А это список с изображениями получается.

Т.е. строку добавить типа берем из списка, вытягиваем в строку и кладем в первоначальное значение переменной postImg1 ? Так можно как то сделать?
Хз насколько я правильно понял задаачу, но вроде твои ошибки в том, что ты вне области цикла обработки тех картинок пробуешь добавить строку. И вместо значения вставляешь название коллекции. А если так:
Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
          var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
           foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
             {
              string temp = Img.GetAttribute("src").Trim(); // вытягивает src
              postImgAll_src.Add(temp); // кладем src в список

             string postLog = string.Format("{0};{1}",postTitle,temp);
             project.SendInfoToLog(postLog, true); 
             ItemList.Add(postLog);
             }
       
       
}
Ну и если не надо отдельный список под src, то тогда закомментируй те две строки с упоминанием "postImgAll_src", чтобы зря ресурсы не жрало. И мой косяк, что не понял сразу тонкость задачи со списком.
 
  • Спасибо
Реакции: IH4w6UuEMt

orka13

Client
Регистрация
07.05.2015
Сообщения
2 179
Благодарностей
2 187
Баллы
113
Т.е. строку добавить типа берем из списка, вытягиваем в строку и кладем в первоначальное значение переменной postImg1 ? Так можно как то сделать?
Тогда так:
Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
          var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
           string postImg1 = "";
           foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
             {
              string temp = Img.GetAttribute("src").Trim(); // вытягивает src
              postImgAll_src.Add(temp); // кладем src в список
             
              postImg1 += temp + ";"; // вытягиваем в строку, то есть в каждом шаге добавляем в конец переменной "postImg1" наше новое значение через разделитель ";" (можно сменить на свои символы)
             }
string postLog = string.Format("{0};{1}",postTitle,postImg1);  
project.SendInfoToLog(postLog, true);
ItemList.Add(postLog);
}
 
Последнее редактирование:
  • Спасибо
Реакции: Koqpe и IH4w6UuEMt

IH4w6UuEMt

Client
Регистрация
01.09.2010
Сообщения
34
Благодарностей
1
Баллы
8
Но функционалу я понял норм, по выводу информации просто видимо специфику не понимаю. Выводит результат как

Код:
Нужное Значение;img2
Нужное Значение;img3
Нужное Значение;img4
...
в моем контексте надо так
Код:
Нужное Значение;img1,img2,img3,img4,...;
Может в таблицу тогда складыват типо по номеру ячейки или просто списки обработать в несколько действий до нужного формата?
 

IH4w6UuEMt

Client
Регистрация
01.09.2010
Сообщения
34
Благодарностей
1
Баллы
8
Тогда так:
Код:
foreach (HtmlElement post in postCollection)
    {
        string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
        HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
          var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
           string postImg1 = "";
           foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
             {
              string temp = Img.GetAttribute("src").Trim(); // вытягивает src
              postImgAll_src.Add(temp); // кладем src в список
            
              postImg1 += temp + ";"; // вытягиваем в строку, то есть в каждом шаге добавляем в конец переменной "postImg1" наше новое значение через разделитель ";" (можно сменить на свои символы)
             }
string postLog = string.Format("{0};{1}",postTitle,postImg1); 
project.SendInfoToLog(postLog, true);
ItemList.Add(postLog);
}
Вот да то что надо работает! Спасибо!!!
 

sdsfwehbn

Новичок
Регистрация
07.12.2017
Сообщения
24
Благодарностей
16
Баллы
3
Вопрос по Xpath

на сайте маил.ру вплывает окно входа.
Вот такой код работает, находит iFrame, а дальше внутри этого фрейма ничего не находит. где моя ошибка?
Код:
//iframe[@class='ag-popup__frame__layout__iframe']
а этот код не работает
Код:
//iframe[@class='ag-popup__frame__layout__iframe']//input[contains(@name,'Username')]
 

sdsfwehbn

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

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Привет всем. Задачка:
нужно взять все div с классом А но не содержащих атрибут fig_.... Где точки это произвольный набор символов( их 4). Что-то конструкцию под зену подобрать не могу.

Код:
("//div[@class='A' and not fig_\w\w\w\w]()")
так не работает.
 
Последнее редактирование:

Hazar

Client
Регистрация
05.12.2018
Сообщения
107
Благодарностей
19
Баллы
18
Чем отличается XPath от конструктора действий. Теперь скажите почему проще не воспользоваться конструктором действий? Он как мне кажется выполняет все те-же действия...
 
Последнее редактирование:

Hazar

Client
Регистрация
05.12.2018
Сообщения
107
Благодарностей
19
Баллы
18
Вот и настал день голосования:do:
Посмотреть вложение 20923...
Чем отличается XPath от конструктора действий. Теперь скажите почему проще не воспользоваться конструктором действий? Он как мне кажется выполняет все те-же действия...
 

Sz5

Client
Регистрация
10.12.2012
Сообщения
157
Благодарностей
186
Баллы
43
Конечно, проще пользоваться конструктором, но при работе с нестандартной разметкой или сайтами, которые регулярно ее обновляют, вы столкнетесь со сложностью в поддержке и отладке ваших шаблонов. xPath более универсальный и лаконичнее.
 
  • Спасибо
Реакции: Hazar

Hazar

Client
Регистрация
05.12.2018
Сообщения
107
Благодарностей
19
Баллы
18
Конечно, проще пользоваться конструктором, но при работе с нестандартной разметкой или сайтами, которые регулярно ее обновляют, вы столкнетесь со сложностью в поддержке и отладке ваших шаблонов. xPath более универсальный и лаконичнее.
Спасибо. Почему же разработчики, решили его не внедрят, как утилиту к зенке, загадка, для меня.
 
Последнее редактирование:

DocSpoc

Client
Регистрация
04.01.2016
Сообщения
287
Благодарностей
169
Баллы
43
Здравствуйте
Сломал голову
Как сделать xPath для кнопки Like в Инсте?
Вот ее код:

<span class="fr66n">
<button class="wpO6b " type="button">
<svg aria-label="Нравится" class="_8-yf5 " fill="#262626" height="24" viewBox="0 0 48 48" width="24">
<path clip-rule="evenodd" d="M34.3 3.5C27.2 3.5 24 8.8 24 8.8s-3.2-5.3-10.3-5.3C6.4 3.5.5 9.9.5 17.8s6.1 12.4 12.2 17.8c9.2 8.2 9.8 8.9 11.3 8.9s2.1-.7 11.3-8.9c6.2-5.5 12.2-10 12.2-17.8 0-7.9-5.9-14.3-13.2-14.3zm-1 29.8c-5.4 4.8-8.3 7.5-9.3 8.1-1-.7-4.6-3.9-9.3-8.1-5.5-4.9-11.2-9-11.2-15.6 0-6.2 4.6-11.3 10.2-11.3 4.1 0 6.3 2 7.9 4.2 3.6 5.1 1.2 5.1 4.8 0 1.6-2.2 3.8-4.2 7.9-4.2 5.6 0 10.2 5.1 10.2 11.3 0 6.7-5.7 10.8-11.2 15.6z" fill-rule="evenodd" class="">
</path>
</svg>
</button>
</span>

Классы использовать скорее всего не стоит - динамические.
Через конструктор я выбираю SVG где есть "Нравится" и у которых height равно 24 (потому что на странице есть еще и лайки комментов, высотой 12).

Столкнулся с двумя проблемами. xPath не хочет работать с тэгом SVG. И как в один xPath запихать два одинаково необходимых условия?

Заранее благодарю за помощь.
 

SkyRuss

Client
Регистрация
13.09.2015
Сообщения
27
Благодарностей
14
Баллы
3

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 721
Баллы
113
Столкнулся с двумя проблемами. xPath не хочет работать с тэгом SVG. И как в один xPath запихать два одинаково необходимых условия?
как пример, доработаете под себя
//*/button/*[ (@aria-label='Нравится') and (@height='24') ]
 
  • Спасибо
Реакции: DocSpoc

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