Get + .FindElement(s)ByXPath

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Хочу вытащить заголовки не прибегая к браузеру. Get'ом тащу код страницы, естественно - в переменную.

Вопрос ещё тупее - есть ли аналог .FindElementByXPath() помимо Regex для парсинга заголовков (h1-6) из переменной? Или все же надо писать типа string regex = @"<h{1-6}любые_символы_и_пробелы>*?<h{1-6}> ?

Upd. Ещё идея в голову пришла - результат Get-запроса оформить как коллекцию элементов всех мастей. Тогда задача вроде как решится, но метода для этого я пока что не нашел. Ищу. Идеи и подсказки приветствуются.
Upd2. Кажется нашел. HtmlAgilityPack. Да/Нет?


C#:
var list = project.Lists["Список 1"];
string url = list[0]; //foreach(string item in list)
string res = ZennoPoster.HttpGet(url,"",@"utf-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"",project.Profile.UserAgent,true,5,null,"",false); //url => item in foreach
 
Последнее редактирование:

backoff

Client
Регистрация
20.04.2015
Сообщения
5 939
Благодарностей
6 411
Баллы
113

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43

backoff

Client
Регистрация
20.04.2015
Сообщения
5 939
Благодарностей
6 411
Баллы
113

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Выполнение действия CSharp OwnCode. [Строка: 5; Cтолбец: 44] Object reference not set to an instance of an object.
Это про var Nodes. Из описания ошибки не могу понять WTF) Heeelp )
Если "слить" первый форич на работу с первым урлом списка, т.е. оставить один урл, как было до этого - все было хорошо... Щас попробую внешний цикл сделать через for()...
_________________________________________
UPD1 : через for то же самое с Nodes; Без цикла, для одного элемента - отрабатывает, хочешь для всех элементов списка - косячит.

C#:
var list = project.Lists["Список 1"];
foreach(string item in list) {
    HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
    html.LoadHtml(ZennoPoster.HttpGet(item,"",@"utf-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"",project.Profile.UserAgent,true,5,null,"",false));
    var Nodes = html.DocumentNode.SelectNodes(@"//h1 | //h2 | //h3 | //h4 | // h5 | //h6");
    foreach(HtmlAgilityPack.HtmlNode header in Nodes) {
        project.Lists["result"].Add(item+";"+header.Name+" "+header.InnerHtml);
    }
}
 
Последнее редактирование:

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Тема закрыта.

Добавил проверку на пустоту в Nodes - всё заработало :-) Скилл ап сегодня неплохой вышел)
P.S. Осталось научиться "красиво" код писать)) Не хочу никак сокращения по переменным складывать))

C#:
var list = project.Lists["Список 1"];
foreach(string url in list) {
    string item = url;
    HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
    html.LoadHtml(ZennoPoster.HttpGet(item,"",@"utf-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,30000,"",project.Profile.UserAgent,true,5,null,"",false));
    HtmlAgilityPack.HtmlNodeCollection Nodes = html.DocumentNode.SelectNodes(@"//h1 | //h2 | //h3 | //h4 | // h5 | //h6");
    if(Nodes != null) {
        foreach(HtmlAgilityPack.HtmlNode header in Nodes)
            project.Lists["result"].Add(item+";"+header.Name+" "+header.InnerText);
    }
    else continue;
}
 

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