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

Discussion in 'Седьмой конкурс статей' started by Sz5, May 15, 2017.

  1. Tnyrtin

    Tnyrtin Client

    Joined:
    May 12, 2015
    Messages:
    72
    Likes Received:
    7
    Спасибо большое.
     
  2. Tnyrtin

    Tnyrtin Client

    Joined:
    May 12, 2015
    Messages:
    72
    Likes Received:
    7
    Подскажите пожалуйста как правильно тут сделать. Получаю ошибку http://joxi.ru/l2ZxLedC0aqRrJ
     
  3. Sz5

    Sz5 Client

    Joined:
    Dec 10, 2012
    Messages:
    153
    Likes Received:
    150
    На 10 строке ошибка, у вас получается два корневых запроса их нельзя объединять, если вы ищите пизд*ка, через метод FindChildByXPath необходимо использовать ./ в начале запроса.
    [​IMG]
    Также для проверки правильности запроса, возьмите запрос со 2 строчки [​IMG] и продолжите его запросом с 10 строчки [​IMG] .

    Получится [​IMG][​IMG]
    и посмотрите что выдаст xPather
    Ну а далее шлифуйте запрос до тех пор, пока у вас не будет получен результат :bt:
     
  4. dimytr

    dimytr Client

    Joined:
    Mar 30, 2016
    Messages:
    16
    Likes Received:
    6
    Отличная статья. Добавил в evernote.
     
    Sz5 likes this.
  5. kagorec

    kagorec Client

    Joined:
    Aug 24, 2013
    Messages:
    557
    Likes Received:
    238
    Наглядный пример как надо упоминать о своей статье в подписи.
    Очень полезная статья.
     
    Sz5 likes this.
  6. Sz5

    Sz5 Client

    Joined:
    Dec 10, 2012
    Messages:
    153
    Likes Received:
    150
    Вот и настал день голосования:do:
    vote.jpg
     
  7. zagrenat

    zagrenat Client

    Joined:
    Nov 2, 2010
    Messages:
    8
    Likes Received:
    2
    Sz5 громадное спасибо, очень помог этой статьей, плюс за то что помог чуть подправить под меня . замечательная статья буду изучать долго и упорно.
     
    Sz5 likes this.
  8. ERNEST

    ERNEST Новичок

    Joined:
    May 22, 2017
    Messages:
    1
    Likes Received:
    1
    Автор Иисус, спасибо ему, очень выручил в нелегком труде изучения XPath! Попозже дополню пост:eek:
     
    Sz5 likes this.
  9. punipula

    punipula Client

    Joined:
    Oct 19, 2012
    Messages:
    12
    Likes Received:
    1
    Лучшая статья! Спасибо за потраченное время!
     
    Sz5 likes this.
  10. Sz5

    Sz5 Client

    Joined:
    Dec 10, 2012
    Messages:
    153
    Likes Received:
    150
    Спасибо всем за фидбек :dn: обязательно приму участие в следующем конкурсе, будет уже без обзора инструментов ZP, но расскажу, каким образом можно заработать деньжат используя ZennoPoster :do:
     
  11. sergej_g

    sergej_g Client

    Joined:
    Nov 29, 2011
    Messages:
    98
    Likes Received:
    58
    Попробуйте так. Нашел на просторах форума.
     

    Attached Files:

    garat likes this.
  12. IH4w6UuEMt

    IH4w6UuEMt Client

    Joined:
    Sep 1, 2010
    Messages:
    32
    Likes Received:
    1
    Добрый! Получаю страницу, там изображений разное количество от 1 до 20 ти - string postImg1 = post.FindChildByXPath(".//div/div/img",0).GetAttribute("src").Trim();

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

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,234
    Likes Received:
    1,111
    Так у тебя В каждом post столько картинок. Или на странице такое количество блоков post находит, где в каждом по 1 картинке?
    Для первого варианта надо сделать поиск не первого элемента postImg1, а всей коллекции и в цикле перепарсить ее (еще один внутренний foreach).
    Для второго варианта все проще. Просто в новый список надо ложить каждое найденное значение.
    Уточни ситуацию и приведу код, если сам не можешь.
     
  14. IH4w6UuEMt

    IH4w6UuEMt Client

    Joined:
    Sep 1, 2010
    Messages:
    32
    Likes Received:
    1
    В одном посте от 1 до 20 ти картинок, только вникаю в C#, поэтому не знаю как правильно сделать, получается надо подсчитать количество картинок и организовать внутренний цикл по условию а в конце выводить в один список
     
  15. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,234
    Likes Received:
    1,111
    Code (C#):
    1. foreach (HtmlElement post in postCollection)
    2.     {
    3.         string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
    4.         HtmlElementCollection postImgAll = item.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
    5.           var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
    6.            foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
    7.              {
    8.               string temp = Img.GetAttribute("src").Trim(); // вытягивает src
    9.               postImgAll_src.Add(temp); // кладем src в список
    10.              }
    11.         string postLog = string.Format("{0};{1}",postTitle,postImg1);
    12.         project.SendInfoToLog(postLog, true);    
    13.         ItemList.Add(postLog);
    14. }
    Проверь код, а то может я где не то прописал, нету на чем оттестировать.
    Ну и чтобы делать в зенке чудеса придется вникать. Я не кодер, но по кусочкам готовых решений из форума\гугла могу сложить под себя хороший C#-снипет.
     
  16. IH4w6UuEMt

    IH4w6UuEMt Client

    Joined:
    Sep 1, 2010
    Messages:
    32
    Likes Received:
    1
    Спасибо вот код работает
    Code (text):
    1. foreach (HtmlElement post in postCollection)
    2.     {
    3.         string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
    4.         HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
    5.           var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
    6.            foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
    7.              {
    8.               string temp = Img.GetAttribute("src").Trim(); // вытягивает src
    9.               postImgAll_src.Add(temp); // кладем src в список
    10.              }
    11.         string postLog = string.Format("{0};{1}",postTitle,postImgAll);
    12.         project.SendInfoToLog(postLog, true);  
    13.         ItemList.Add(postLog);
    14. }
    Список добавил в него парсятся src картинок, а вот как положить в изначальный список?

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

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

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

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,234
    Likes Received:
    1,111
    Хз насколько я правильно понял задаачу, но вроде твои ошибки в том, что ты вне области цикла обработки тех картинок пробуешь добавить строку. И вместо значения вставляешь название коллекции. А если так:
    Code (C#):
    1. foreach (HtmlElement post in postCollection)
    2.     {
    3.         string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
    4.         HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
    5.           var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
    6.            foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
    7.              {
    8.               string temp = Img.GetAttribute("src").Trim(); // вытягивает src
    9.               postImgAll_src.Add(temp); // кладем src в список
    10.  
    11.              string postLog = string.Format("{0};{1}",postTitle,temp);
    12.              project.SendInfoToLog(postLog, true);
    13.              ItemList.Add(postLog);
    14.              }
    15.        
    16.        
    17. }
    Ну и если не надо отдельный список под src, то тогда закомментируй те две строки с упоминанием "postImgAll_src", чтобы зря ресурсы не жрало. И мой косяк, что не понял сразу тонкость задачи со списком.
     
    IH4w6UuEMt likes this.
  18. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,234
    Likes Received:
    1,111
    Тогда так:
    Code (C#):
    1. foreach (HtmlElement post in postCollection)
    2.     {
    3.         string postTitle = post.FindChildByXPath(".//a[1]",0).InnerText.Trim();
    4.         HtmlElementCollection postImgAll = post.FindChildrenByXPath(".//div/div/img"); // вот и наша новая коллекция картинок
    5.           var postImgAll_src = project.Lists["postImgAll_src"]; // в пустой список проекта postImgAll_src (не забудьте создать) будут закидаться найденные значения, здесь мы его подключаем
    6.            string postImg1 = "";
    7.            foreach (HtmlElement Img in postImgAll) // начинаем перебор в цикле
    8.              {
    9.               string temp = Img.GetAttribute("src").Trim(); // вытягивает src
    10.               postImgAll_src.Add(temp); // кладем src в список
    11.              
    12.               postImg1 += temp + ";"; // вытягиваем в строку, то есть в каждом шаге добавляем в конец переменной "postImg1" наше новое значение через разделитель ";" (можно сменить на свои символы)
    13.              }
    14. string postLog = string.Format("{0};{1}",postTitle,postImg1);  
    15. project.SendInfoToLog(postLog, true);
    16. ItemList.Add(postLog);
    17. }
     
    Last edited: Oct 4, 2017
    Kare and IH4w6UuEMt like this.
  19. IH4w6UuEMt

    IH4w6UuEMt Client

    Joined:
    Sep 1, 2010
    Messages:
    32
    Likes Received:
    1
    Но функционалу я понял норм, по выводу информации просто видимо специфику не понимаю. Выводит результат как

    Code (text):
    1.  
    2. Нужное Значение;img2
    3. Нужное Значение;img3
    4. Нужное Значение;img4
    5. ...
    в моем контексте надо так
    Code (text):
    1. Нужное Значение;img1,img2,img3,img4,...;
    Может в таблицу тогда складыват типо по номеру ячейки или просто списки обработать в несколько действий до нужного формата?
     
  20. IH4w6UuEMt

    IH4w6UuEMt Client

    Joined:
    Sep 1, 2010
    Messages:
    32
    Likes Received:
    1
    Вот да то что надо работает! Спасибо!!!
     
  21. sdsfwehbn

    sdsfwehbn Новичок

    Joined:
    Dec 7, 2017
    Messages:
    24
    Likes Received:
    8
    Вопрос по Xpath

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

    sdsfwehbn Новичок

    Joined:
    Dec 7, 2017
    Messages:
    24
    Likes Received:
    8
  23. luk911

    luk911 Client

    Joined:
    Jan 17, 2013
    Messages:
    351
    Likes Received:
    194
    Привет всем. Задачка:
    нужно взять все div с классом А но не содержащих атрибут fig_.... Где точки это произвольный набор символов( их 4). Что-то конструкцию под зену подобрать не могу.

    Code (text):
    1. ("//div[@class='A' and not fig_\w\w\w\w]()")
    так не работает.
     
    Last edited: May 17, 2019
  24. Hazar

    Hazar Client

    Joined:
    Dec 5, 2018
    Messages:
    69
    Likes Received:
    8
    Чем отличается XPath от конструктора действий. Теперь скажите почему проще не воспользоваться конструктором действий? Он как мне кажется выполняет все те-же действия...
     
    Last edited: Jun 5, 2019
  25. Hazar

    Hazar Client

    Joined:
    Dec 5, 2018
    Messages:
    69
    Likes Received:
    8
     
  26. Sz5

    Sz5 Client

    Joined:
    Dec 10, 2012
    Messages:
    153
    Likes Received:
    150
    Конечно, проще пользоваться конструктором, но при работе с нестандартной разметкой или сайтами, которые регулярно ее обновляют, вы столкнетесь со сложностью в поддержке и отладке ваших шаблонов. xPath более универсальный и лаконичнее.
     
    Hazar likes this.
  27. Hazar

    Hazar Client

    Joined:
    Dec 5, 2018
    Messages:
    69
    Likes Received:
    8
    Спасибо. Почему же разработчики, решили его не внедрят, как утилиту к зенке, загадка, для меня.
     
    Last edited: Jun 5, 2019

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)