Кубик парсим страницу в С#

Discussion in 'Вопросы новичков' started by russya, Apr 12, 2019.

  1. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    Всем привет! нужно решение отправки гет запроса в кубике C# и работы потом с этим html кодам. Раньше все время пользовался регулярками, сейчас хочу перейти на xpatch.
    Папробывал кубик парсим страницу конвертировать в C#. Немного разобрался как работает.

    Code (text):
    1. var brendspisok = ZennoPoster.Parser.ParseByXpath(get2,"//span[@class='a-list-item']/a[@class='a-link-normal']","title").ToList();
    Вот стаким способом пытаюсь работать. Как я понял функции xpatch здесь не работают, т.к. писал contains и било ошибку.
    И очень странно что всегда в лист нужно слаживать, даже если нужна 1 переменная. Короче очень не удобно. Я знаю что есть библиотека которую можно подвязывать к зенке и работать. Но это очень не удобно, т.к. нужны зенно боксы и клиентом шаблоны бросать. Может есть у кого получше решение. Или может админы обещали по умолчанию подгружать эту библиотеку? как работать с переменными и xpatch? вот моя проблема
     
  2. ial1408

    ial1408 Client

    Joined:
    Jul 26, 2016
    Messages:
    92
    Likes Received:
    10
    Если хочешь переходить на Xpath тебе не обязательно брать дом страницы куда либо, достаточно загрузить ее в браузере, а далее воспользоваться instance.ActiveTab.FindElementByXpath(писал на память) - это если один элемент, если коллекцию то метод FindElementsByXpath
     
    russya likes this.
  3. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,230
    Likes Received:
    1,103
    "ZennoPoster.Parser.ParseByXpath" работает только с вкладкой браузера, а не с кодом-ответом Get-запроса. То есть для безбраузерных шаблонов не получится его внедрить. Делайте клиентам мануалы по подкючению библиотек. Это частая практика продавцов сложных шаблонов. Пример шаблона с библиотекой я наводил.
     
    russya and specialist like this.
  4. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    "ZennoPoster.Parser.ParseByXpath - там есть функция парсинга с переменной, только до конца в ней разобраться не могу
     
    Zymlex and orka13 like this.
  5. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,230
    Likes Received:
    1,103
    Да, сам недосмотрел, извиняюсь.
    Вот так парсит текстовку элементов по xpath и возвращает первое найденное значение, сразу с обрезанием лишних пробелов (Trim):
    Code (csharp):
    1. var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
    2. return brendspisok.ElementAt(0).Trim();
    Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
     
  6. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    вот и я информации не нахожу. Примеров не хватает. Спасибо буду изучать
     
  7. Zymlex

    Zymlex Client

    Joined:
    Oct 24, 2016
    Messages:
    1,476
    Likes Received:
    755
    О нём даже в нововведениях не написали, вот народ и не знает.
     
    Last edited: Apr 17, 2019
  8. Rooter85

    Rooter85 Client

    Joined:
    Jul 4, 2015
    Messages:
    189
    Likes Received:
    36
    Интересное новшество. Есть еще поиск по селекторам. Проверка на видимость элементов. Но только это для сбора атрибутов, с помощью этих методов нельзя собрать коллекцию элементов? Собираем только массив строк. Нельзя этими методами находить видимые элементы для кликов и других событий. Или я что-то не понял?
     
  9. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,230
    Likes Received:
    1,103
    А нафига это для безбраузерного шаблона? Здесь же только сбор данных затронут (парсинг).
    Для браузера есть классические методы поиска и взаимодействия (FindElementByXPath, Click и т.д.).
     
  10. Rooter85

    Rooter85 Client

    Joined:
    Jul 4, 2015
    Messages:
    189
    Likes Received:
    36
    Это да, но здесь есть возможность находить только видимые элементы. А при использовании классических методов нужно делать дополнительную проверку. Код разрастается.
     
  11. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    1. var brendspisok = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
    2. return brendspisok.ElementAt(0).Trim();
    Может подскажите, если не нашло такого xpatch, то у меня сразу с# кубик выходит с ошибкой. А как сделать чтобы продолжал работу? знает кто?
     
  12. Rooter85

    Rooter85 Client

    Joined:
    Jul 4, 2015
    Messages:
    189
    Likes Received:
    36
    Перед return сделайте проверку, пустой список или нет.
     
  13. inotoxic

    inotoxic Client

    Joined:
    Apr 20, 2015
    Messages:
    304
    Likes Received:
    100
    А где там список?
     
  14. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,230
    Likes Received:
    1,103
    Можно костылем через try-catch, с последующим выводом текста ошибки в лог ProjectMaker :
    Code (csharp):
    1. try {
    2.     var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
    3.     return brendspisok.ElementAt(0).Trim();
    4. }
    5. catch(Exception ex) {
    6.     //return ex.Message;
    7.     project.SendInfoToLog(ex.Message, false);
    8. }
    Ибо там до списка не доходит дело, там сразу на строке парсинга ошибку словит если не сможет найти ни одного совпадения по xpath.
     
    Rooter85 likes this.
  15. Rooter85

    Rooter85 Client

    Joined:
    Jul 4, 2015
    Messages:
    189
    Likes Received:
    36
    var brendspisok
     
  16. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    Хочу уже до конца разобраться с этим parsr. Подскажите как можно сделать проверку на то что не нашли элемента по xpatch.

    В этом примере все хорошо работает.
    Code (text):
    1. string get = ZennoPoster.HTTP.Request(InterfacesLibrary.Enums.Http.HttpMethod.GET,"https://2ip.ru/","","",instance.GetProxy(),"UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,10000,instance.GetCookie(),    project.Profile.UserAgent,true,5,new[] {""},"",true,false,project.Profile.CookieContainer);
    2. project.Variables["rez"].Value = get;
    3. string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
    4. return gorod;
    А здесь я специально ссылку на страницу поменял, и сразу же ошибка
    Code (text):
    1. string get = ZennoPoster.HTTP.Request(InterfacesLibrary.Enums.Http.HttpMethod.GET,"https://2ip.ru/services/","","",instance.GetProxy(),"UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,10000,instance.GetCookie(),    project.Profile.UserAgent,true,5,new[] {""},"",true,false,project.Profile.CookieContainer);
    2. project.Variables["rez"].Value = get;
    3. string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
    4. if (gorod==string.Empty) return "ошибка";
    5. return gorod;
    6.  
    Выполнение действия CSharp OwnCode. Ошибка получения данных из html документа


    Вроде и классный инструмент, но как его использовать, я до конца не понимаю.
     
  17. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    и еще вопрос не по теме. Может кто-то знает. Когда в кубике с# я ставлю точку остановки и дохожу до гет запроса
    Code (text):
    1. string get = ZennoPoster.HTTP.Request(InterfacesLibrary.Enums.Http.HttpMethod.GET,"https://2ip.ru/services/","","",instance.GetProxy(),"UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,10000,instance.GetCookie(),    project.Profile.UserAgent,true,5,new[] {""},"",true,false,project.Profile.CookieContainer);
    у меня все время на нем ошибка и дальше я не могу по коду идти. Очень не удобно. Но когда запускаю без точки остановки, все хорошо работает. Может знает кто как это исправить?
    http://joxi.ru/a2XQjPJtwaQVOA
     
  18. russya

    russya Client

    Joined:
    Jul 8, 2014
    Messages:
    573
    Likes Received:
    49
    На этот вопрос нашел решение, точнее друг подсказал

    Code (text):
    1. string get = ZennoPoster.HTTP.Request(InterfacesLibrary.Enums.Http.HttpMethod.GET,"https://2ip.ru/services/","","",instance.GetProxy(),"UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,10000,instance.GetCookie(),  project.Profile.UserAgent,true,5,new[] {""},"",true,false,project.Profile.CookieContainer);
    2. project.Variables["rez"].Value = get;
    3. try
    4. {
    5.   string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
    6.   return gorod;
    7. }
    8. catch
    9. {
    10.   return "ошибка";
    11. }
     
  19. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,230
    Likes Received:
    1,103
    зачем повторять вопросы? я же в предыдущем посте получше друга то же решение предложил с выводом ошибки в лог.
     
    Rooter85 likes this.
  20. sanya

    sanya Client

    Joined:
    Sep 8, 2015
    Messages:
    160
    Likes Received:
    31
    Реализовал таким образом, но вижу очень проц загружен. В гугле пишут якобы данный костыль грузит проц, может такое быть?может есть мысли как еще это обходить?
     
  21. orka13

    orka13 Client

    Joined:
    May 7, 2015
    Messages:
    1,230
    Likes Received:
    1,103
    Увы, с такой проблемой не сталкивался, так как в своей практике редко приходилось таким костылем работать. Точно из-за него нагрузка? Гугл не даст точный ответ, трассировка проекта лучше поможет определить на каком шаге шаблон долго думает.
     
    sanya likes this.
  22. sanya

    sanya Client

    Joined:
    Sep 8, 2015
    Messages:
    160
    Likes Received:
    31
    может и не в нем)первый под подозрение попал
     
  23. Rooter85

    Rooter85 Client

    Joined:
    Jul 4, 2015
    Messages:
    189
    Likes Received:
    36
    Из личного опыта, если использовать поиск по xpath в мобильных приложениях, то поиск происходит дольше чем поиск по id. И если есть возможность найти элемент через resource-id то использую его а не xpath. С проблемой большой нагрузки в десктопных браузерах не сталкивался при использовании xpath, но можно предположить что поиск по xpath будет работать медленнее чем поиск по атрибутам. В вашем примере путь xpath простой и его можно заменить на поиск по атрибуту через regexp. Попробуйте, может повлияет на скорость и нагрузку.
     
  24. Zymlex

    Zymlex Client

    Joined:
    Oct 24, 2016
    Messages:
    1,476
    Likes Received:
    755
    Добавлю, запрос элемента по id (не через xPath) в браузере - будет быстрее, так как браузер хранит в памяти список всех id и может сразу к ним обратиться без поиска.
    Но за поиск элементов в приложении, тут отвечает что-то иное.
     
    Last edited: May 21, 2019

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