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

  • Автор темы Автор темы russya
  • Дата начала Дата начала

russya

Client
Регистрация
08.07.2014
Сообщения
764
Реакции
90
Баллы
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? вот моя проблема
 
Если хочешь переходить на Xpath тебе не обязательно брать дом страницы куда либо, достаточно загрузить ее в браузере, а далее воспользоваться instance.ActiveTab.FindElementByXpath(писал на память) - это если один элемент, если коллекцию то метод FindElementsByXpath
 
  • Оценить
Реакции: russya
"ZennoPoster.Parser.ParseByXpath" работает только с вкладкой браузера, а не с кодом-ответом Get-запроса. То есть для безбраузерных шаблонов не получится его внедрить. Делайте клиентам мануалы по подкючению библиотек. Это частая практика продавцов сложных шаблонов. Пример шаблона с библиотекой я наводил.
 
  • Оценить
Реакции: russya и specialist
"ZennoPoster.Parser.ParseByXpath" работает только с вкладкой браузера, а не с кодом-ответом Get-запроса. То есть для безбраузерных шаблонов не получится его внедрить. Делайте клиентам мануалы по подкючению библиотек. Это частая практика продавцов сложных шаблонов. Пример шаблона с библиотекой я наводил.
"ZennoPoster.Parser.ParseByXpath - там есть функция парсинга с переменной, только до конца в ней разобраться не могу
 
  • Оценить
Реакции: ZX и orka13
"ZennoPoster.Parser.ParseByXpath - там есть функция парсинга с переменной, только до конца в ней разобраться не могу
Да, сам недосмотрел, извиняюсь.
Вот так парсит текстовку элементов по xpath и возвращает первое найденное значение, сразу с обрезанием лишних пробелов (Trim):
C#:
Развернуть Свернуть Копировать
var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
return brendspisok.ElementAt(0).Trim();
Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
 
  • Оценить
Реакции: trecho
Да, сам недосмотрел, извиняюсь.
Вот так парсит текстовку элементов по xpath и возвращает первое найденное значение, сразу с обрезанием лишних пробелов (Trim):
C#:
Развернуть Свернуть Копировать
var brendspisok  = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
return brendspisok.ElementAt(0).Trim();
Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
вот и я информации не нахожу. Примеров не хватает. Спасибо буду изучать
 
Что то не вижу чтобы на форуме активно использовали это нововведение. Видать большинству проще с отдельной библиотекой.
О нём даже в нововведениях не написали, вот народ и не знает.
 
Последнее редактирование:
Интересное новшество. Есть еще поиск по селекторам. Проверка на видимость элементов. Но только это для сбора атрибутов, с помощью этих методов нельзя собрать коллекцию элементов? Собираем только массив строк. Нельзя этими методами находить видимые элементы для кликов и других событий. Или я что-то не понял?
 
Интересное новшество. Есть еще поиск по селекторам. Проверка на видимость элементов. Но только это для сбора атрибутов, с помощью этих методов нельзя собрать коллекцию элементов? Собираем только массив строк. Нельзя этими методами находить видимые элементы для кликов и других событий. Или я что-то не понял?
А нафига это для безбраузерного шаблона? Здесь же только сбор данных затронут (парсинг).
Для браузера есть классические методы поиска и взаимодействия (FindElementByXPath, Click и т.д.).
 
Для браузера есть классические методы поиска и взаимодействия (FindElementByXPath, Click и т.д.).
Это да, но здесь есть возможность находить только видимые элементы. А при использовании классических методов нужно делать дополнительную проверку. Код разрастается.
 
  1. var brendspisok = ZennoPoster.Parser.ParseByXpath(get2, @"//div[contains(text(), ' ')]", "innerText");
  2. return brendspisok.ElementAt(0).Trim();
Может подскажите, если не нашло такого xpatch, то у меня сразу с# кубик выходит с ошибкой. А как сделать чтобы продолжал работу? знает кто?
 
Перед return сделайте проверку, пустой список или нет.
 
  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
Хочу уже до конца разобраться с этим 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);
у меня все время на нем ошибка и дальше я не могу по коду идти. Очень не удобно. Но когда запускаю без точки остановки, все хорошо работает. Может знает кто как это исправить?
http://joxi.ru/a2XQjPJtwaQVOA
 
Хочу уже до конца разобраться с этим 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 "ошибка";
}
 
На этот вопрос нашел решение, точнее друг подсказал

Код:
Развернуть Свернуть Копировать
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
Можно костылем через 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.
Реализовал таким образом, но вижу очень проц загружен. В гугле пишут якобы данный костыль грузит проц, может такое быть?может есть мысли как еще это обходить?
 
Увы, с такой проблемой не сталкивался, так как в своей практике редко приходилось таким костылем работать. Точно из-за него нагрузка? Гугл не даст точный ответ, трассировка проекта лучше поможет определить на каком шаге шаблон долго думает.
 
  • Оценить
Реакции: sanya
Из личного опыта, если использовать поиск по xpath в мобильных приложениях, то поиск происходит дольше чем поиск по id. И если есть возможность найти элемент через resource-id то использую его а не xpath. С проблемой большой нагрузки в десктопных браузерах не сталкивался при использовании xpath, но можно предположить что поиск по xpath будет работать медленнее чем поиск по атрибутам. В вашем примере путь xpath простой и его можно заменить на поиск по атрибуту через regexp. Попробуйте, может повлияет на скорость и нагрузку.
 

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