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

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
Всем привет! нужно решение отправки гет запроса в кубике C# и работы потом с этим html кодам. Раньше все время пользовался регулярками, сейчас хочу перейти на xpatch.
Папробывал кубик парсим страницу конвертировать в C#. Немного разобрался как работает.

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

ial1408

Client
Регистрация
26.07.2016
Сообщения
194
Благодарностей
18
Баллы
18
Если хочешь переходить на Xpath тебе не обязательно брать дом страницы куда либо, достаточно загрузить ее в браузере, а далее воспользоваться instance.ActiveTab.FindElementByXpath(писал на память) - это если один элемент, если коллекцию то метод FindElementsByXpath
 
  • Спасибо
Реакции: russya

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
"ZennoPoster.Parser.ParseByXpath" работает только с вкладкой браузера, а не с кодом-ответом Get-запроса. То есть для безбраузерных шаблонов не получится его внедрить. Делайте клиентам мануалы по подкючению библиотек. Это частая практика продавцов сложных шаблонов. Пример шаблона с библиотекой я наводил.
 
  • Спасибо
Реакции: russya и specialist

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
"ZennoPoster.Parser.ParseByXpath" работает только с вкладкой браузера, а не с кодом-ответом Get-запроса. То есть для безбраузерных шаблонов не получится его внедрить. Делайте клиентам мануалы по подкючению библиотек. Это частая практика продавцов сложных шаблонов. Пример шаблона с библиотекой я наводил.
"ZennoPoster.Parser.ParseByXpath - там есть функция парсинга с переменной, только до конца в ней разобраться не могу
 
  • Спасибо
Реакции: Yuriy Zymlex и orka13

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
"ZennoPoster.Parser.ParseByXpath - там есть функция парсинга с переменной, только до конца в ней разобраться не могу
Да, сам недосмотрел, извиняюсь.
Вот так парсит текстовку элементов по xpath и возвращает первое найденное значение, сразу с обрезанием лишних пробелов (Trim):
C#:
var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
return brendspisok.ElementAt(0).Trim();
Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
 
  • Спасибо
Реакции: trecho

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
Да, сам недосмотрел, извиняюсь.
Вот так парсит текстовку элементов по xpath и возвращает первое найденное значение, сразу с обрезанием лишних пробелов (Trim):
C#:
var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
return brendspisok.ElementAt(0).Trim();
Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
вот и я информации не нахожу. Примеров не хватает. Спасибо буду изучать
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
О нём даже в нововведениях не написали, вот народ и не знает.
 
Последнее редактирование:

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Интересное новшество. Есть еще поиск по селекторам. Проверка на видимость элементов. Но только это для сбора атрибутов, с помощью этих методов нельзя собрать коллекцию элементов? Собираем только массив строк. Нельзя этими методами находить видимые элементы для кликов и других событий. Или я что-то не понял?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Интересное новшество. Есть еще поиск по селекторам. Проверка на видимость элементов. Но только это для сбора атрибутов, с помощью этих методов нельзя собрать коллекцию элементов? Собираем только массив строк. Нельзя этими методами находить видимые элементы для кликов и других событий. Или я что-то не понял?
А нафига это для безбраузерного шаблона? Здесь же только сбор данных затронут (парсинг).
Для браузера есть классические методы поиска и взаимодействия (FindElementByXPath, Click и т.д.).
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Для браузера есть классические методы поиска и взаимодействия (FindElementByXPath, Click и т.д.).
Это да, но здесь есть возможность находить только видимые элементы. А при использовании классических методов нужно делать дополнительную проверку. Код разрастается.
 

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
  1. var brendspisok = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
  2. return brendspisok.ElementAt(0).Trim();
Может подскажите, если не нашло такого xpatch, то у меня сразу с# кубик выходит с ошибкой. А как сделать чтобы продолжал работу? знает кто?
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Перед return сделайте проверку, пустой список или нет.
 

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
164
Баллы
43

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
  1. var brendspisok = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
  2. return brendspisok.ElementAt(0).Trim();
Может подскажите, если не нашло такого xpatch, то у меня сразу с# кубик выходит с ошибкой. А как сделать чтобы продолжал работу? знает кто?
Можно костылем через try-catch, с последующим выводом текста ошибки в лог ProjectMaker :
C#:
try {
    var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
    return brendspisok.ElementAt(0).Trim();
}
catch(Exception ex) {
    //return ex.Message;
    project.SendInfoToLog(ex.Message, false);
}
Ибо там до списка не доходит дело, там сразу на строке парсинга ошибку словит если не сможет найти ни одного совпадения по xpath.
 
  • Спасибо
Реакции: Шива и Rooter85

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
Хочу уже до конца разобраться с этим parsr. Подскажите как можно сделать проверку на то что не нашли элемента по xpatch.

В этом примере все хорошо работает.
Код:
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);
project.Variables["rez"].Value = get;
string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
return gorod;
А здесь я специально ссылку на страницу поменял, и сразу же ошибка
Код:
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);
project.Variables["rez"].Value = get;
string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
if (gorod==string.Empty) return "ошибка";
return gorod;
Выполнение действия CSharp OwnCode. Ошибка получения данных из html документа


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

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
и еще вопрос не по теме. Может кто-то знает. Когда в кубике с# я ставлю точку остановки и дохожу до гет запроса
Код:
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
 

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
Хочу уже до конца разобраться с этим parsr. Подскажите как можно сделать проверку на то что не нашли элемента по xpatch.

В этом примере все хорошо работает.
Код:
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);
project.Variables["rez"].Value = get;
string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
return gorod;
А здесь я специально ссылку на страницу поменял, и сразу же ошибка
Код:
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);
project.Variables["rez"].Value = get;
string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
if (gorod==string.Empty) return "ошибка";
return gorod;
Выполнение действия CSharp OwnCode. Ошибка получения данных из html документа


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

Код:
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);
project.Variables["rez"].Value = get;
try
{
  string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
  return gorod;
}
catch
{
  return "ошибка";
}
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
На этот вопрос нашел решение, точнее друг подсказал

Код:
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);
project.Variables["rez"].Value = get;
try
{
  string gorod = ZennoPoster.Parser.ParseByXpath(get,"//big[@id='d_clip_button']","innertext").ToList().ElementAt(0).ToString();
  return gorod;
}
catch
{
  return "ошибка";
}
зачем повторять вопросы? я же в предыдущем посте получше друга то же решение предложил с выводом ошибки в лог.
 
  • Спасибо
Реакции: Rooter85

sanya

Client
Регистрация
08.09.2015
Сообщения
184
Благодарностей
49
Баллы
28
Можно костылем через try-catch, с последующим выводом текста ошибки в лог ProjectMaker :
C#:
try {
    var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
    return brendspisok.ElementAt(0).Trim();
}
catch(Exception ex) {
    //return ex.Message;
    project.SendInfoToLog(ex.Message, false);
}
Ибо там до списка не доходит дело, там сразу на строке парсинга ошибку словит если не сможет найти ни одного совпадения по xpath.
Реализовал таким образом, но вижу очень проц загружен. В гугле пишут якобы данный костыль грузит проц, может такое быть?может есть мысли как еще это обходить?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Увы, с такой проблемой не сталкивался, так как в своей практике редко приходилось таким костылем работать. Точно из-за него нагрузка? Гугл не даст точный ответ, трассировка проекта лучше поможет определить на каком шаге шаблон долго думает.
 
  • Спасибо
Реакции: sanya

sanya

Client
Регистрация
08.09.2015
Сообщения
184
Благодарностей
49
Баллы
28
может и не в нем)первый под подозрение попал
 

Rooter85

Client
Регистрация
04.07.2015
Сообщения
244
Благодарностей
64
Баллы
28
Из личного опыта, если использовать поиск по xpath в мобильных приложениях, то поиск происходит дольше чем поиск по id. И если есть возможность найти элемент через resource-id то использую его а не xpath. С проблемой большой нагрузки в десктопных браузерах не сталкивался при использовании xpath, но можно предположить что поиск по xpath будет работать медленнее чем поиск по атрибутам. В вашем примере путь xpath простой и его можно заменить на поиск по атрибуту через regexp. Попробуйте, может повлияет на скорость и нагрузку.
 

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