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

Спасибо большое.
 
Подскажите пожалуйста как правильно тут сделать. Получаю ошибку http://joxi.ru/l2ZxLedC0aqRrJ
На 10 строке ошибка, у вас получается два корневых запроса их нельзя объединять, если вы ищите пизд*ка, через метод FindChildByXPath необходимо использовать ./ в начале запроса.
31cf74fdd1.png

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

Получится
ff338de208.png
cc79399813.png

и посмотрите что выдаст xPather
Ну а далее шлифуйте запрос до тех пор, пока у вас не будет получен результат :bt:
 
Отличная статья. Добавил в evernote.
 
  • Спасибо
Реакции: Sz5
Вот и настал день голосования:do:
vote.jpg
 
Sz5 громадное спасибо, очень помог этой статьей, плюс за то что помог чуть подправить под меня . замечательная статья буду изучать долго и упорно.
 
  • Спасибо
Реакции: Sz5
Автор Иисус, спасибо ему, очень выручил в нелегком труде изучения XPath! Попозже дополню пост:eek:
 
  • Спасибо
Реакции: Sz5
Лучшая статья! Спасибо за потраченное время!
 
  • Спасибо
Реакции: Sz5
Спасибо всем за фидбек :dn: обязательно приму участие в следующем конкурсе, будет уже без обзора инструментов ZP, но расскажу, каким образом можно заработать деньжат используя ZennoPoster :do:
 
добрые люди подскажите пжл - а если контент появляется при прокрутки страницы - что нужно добавить в код?
сначало нужно полностью чтобы подгрузилась станица? как пример www_cosmo.ru/beauty/ там страниц 30-50

Попробуйте так. Нашел на просторах форума.
 

Вложения

  • Спасибо
Реакции: garat
Добрый! Получаю страницу, там изображений разное количество от 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);
}

У меня вопрос, а как вывести весь массив с картинками? Он берет первый элемент по умолчанию я так понимаю? Или надо подсчитывать количество элементов и цикл организовывать на вывод элементов ? Или другие пути есть?
 
Добрый! Получаю страницу, там изображений разное количество от 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).
Для второго варианта все проще. Просто в новый список надо ложить каждое найденное значение.
Уточни ситуацию и приведу код, если сам не можешь.
 
Так у тебя В каждом post столько картинок. Или на странице такое количество блоков post находит, где в каждом по 1 картинке?
Для первого варианта надо сделать поиск не первого элемента postImg1, а всей коллекции и в цикле перепарсить ее (еще один внутренний foreach).
Для второго варианта все проще. Просто в новый список надо ложить каждое найденное значение.
Уточни ситуацию и приведу код, если сам не можешь.

В одном посте от 1 до 20 ти картинок, только вникаю в C#, поэтому не знаю как правильно сделать, получается надо подсчитать количество картинок и организовать внутренний цикл по условию а в конце выводить в один список
 
Код:
Развернуть Свернуть Копировать
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#-снипет.
 
Спасибо вот код работает
Код:
Развернуть Свернуть Копировать
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,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
Т.е. строку добавить типа берем из списка, вытягиваем в строку и кладем в первоначальное значение переменной 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
Но функционалу я понял норм, по выводу информации просто видимо специфику не понимаю. Выводит результат как

Код:
Развернуть Свернуть Копировать
Нужное Значение;img2
Нужное Значение;img3
Нужное Значение;img4
...

в моем контексте надо так
Код:
Развернуть Свернуть Копировать
Нужное Значение;img1,img2,img3,img4,...;

Может в таблицу тогда складыват типо по номеру ячейки или просто списки обработать в несколько действий до нужного формата?
 
Тогда так:
Код:
Развернуть Свернуть Копировать
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);
}
Вот да то что надо работает! Спасибо!!!
 
Вопрос по Xpath

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

а этот код не работает
Код:
Развернуть Свернуть Копировать
//iframe[@class='ag-popup__frame__layout__iframe']//input[contains(@name,'Username')]
 
Привет всем. Задачка:
нужно взять все div с классом А но не содержащих атрибут fig_.... Где точки это произвольный набор символов( их 4). Что-то конструкцию под зену подобрать не могу.

Код:
Развернуть Свернуть Копировать
("//div[@class='A' and not fig_\w\w\w\w]()")

так не работает.
 
Последнее редактирование:
Чем отличается XPath от конструктора действий. Теперь скажите почему проще не воспользоваться конструктором действий? Он как мне кажется выполняет все те-же действия...
 
Последнее редактирование:
Вот и настал день голосования:do:
Посмотреть вложение 20923...
Чем отличается XPath от конструктора действий. Теперь скажите почему проще не воспользоваться конструктором действий? Он как мне кажется выполняет все те-же действия...
 
Конечно, проще пользоваться конструктором, но при работе с нестандартной разметкой или сайтами, которые регулярно ее обновляют, вы столкнетесь со сложностью в поддержке и отладке ваших шаблонов. xPath более универсальный и лаконичнее.
 
  • Спасибо
Реакции: Hazar
Конечно, проще пользоваться конструктором, но при работе с нестандартной разметкой или сайтами, которые регулярно ее обновляют, вы столкнетесь со сложностью в поддержке и отладке ваших шаблонов. xPath более универсальный и лаконичнее.
Спасибо. Почему же разработчики, решили его не внедрят, как утилиту к зенке, загадка, для меня.
 
Последнее редактирование:
Здравствуйте
Сломал голову
Как сделать 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 запихать два одинаково необходимых условия?

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

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