Парсинг на С#

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
67
Баллы
28
Помогите разобраться с парсингом на с#. Хочу для своего удобства заменить стандартные кубики парсинга данных на c#, но вот проблема в том, что не все может спарсить. Делаю по простому, конвертирую в C# кубик парсинга данных и его в код, а в конце вывод спаршеного в переменную, но вот не выдает результат.
Вот такой код:
C#:
Tab tab = instance.ActiveTab;
if (tab.IsVoid || tab.IsNull) return -1;
// Получаем атрибут "innerText" всех элементов, соответствующих пути "div.task.task_focused>div:nth-child(1)>div:nth-child(2)>span:nth-child(2)"
var attributes = ZennoPoster.Parser.ParseByCssSelector(tab, ZennoLab.InterfacesLibrary.Enums.Parser.SourceType.Dom, "div.task.task_focused>div:nth-child(1)>div:nth-child(2)>span:nth-child(2)", "innerText", true).ToList();
// Фильтруем элементы
attributes.Filter(ZennoLab.InterfacesLibrary.Enums.Parser.FilterType.None, "");
// Выбираем элементы из диапазона "0"
attributes.Range("0");

return attributes.ElementAt(0);
Этот кубик выдает такую ошибку: "Выполнение действия CSharp OwnCode. Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции." Имя параметра: index.

Подскажите, что я неправильно делаю? Самое интересное он выдает такую ошибку, только когда я пытаюсь единичный элемент спарсить, если же их больше 1, то он парсит. Так же пробовал на XPath, такой же результат
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Мне было бы интересно посмотреть страничку и что ты пытаешься вытащить. Первое что в голову приходит - индексы есть у массивов. Ты пробовал выводить по одному элементу собранной коллекции начиная с 0-вого, посмотреть какой результат ты получаешь и от этого танцевать?

Если решение найдено - в студию :-)
 

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
67
Баллы
28
Да решение было найдено. Брать значение не через ElementAt, а через примитивное указание индекса. Было так
return attributes.ElementAt(0); стало так return attributes[0];
Хотя нет, там где нужно не работает. Проверил на другом примере работало.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
Проверил на другом примере работало.
Попробуйте вместо CssSelector использовать поиск через Xpath. На форуме есть хорошая статья по парсингу с использованием xpath. Скорее всего в одном случае у элемента есть атрибуты, а в другом нет или верстка отличается.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Да решение было найдено. Брать значение не через ElementAt, а через примитивное указание индекса. Было так
return attributes.ElementAt(0); стало так return attributes[0];
Хотя нет, там где нужно не работает. Проверил на другом примере работало.
попробуй GetByNumber вместо ElementAt
 

b1zar

Client
Регистрация
29.06.2019
Сообщения
107
Благодарностей
67
Баллы
28
Попробуйте вместо CssSelector использовать поиск через Xpath. На форуме есть хорошая статья по парсингу с использованием xpath. Скорее всего в одном случае у элемента есть атрибуты, а в другом нет или верстка отличается.
Да, пробовал разными способами, но вот обычный кубик находит это значение, а вот на c# не выпаршивает. Проверял через .Count там просто 0 значений
 

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