Берется DOM, но парсится только первое совпадение, вместо 30

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Делаю блоками, но для публикации здесь перевел блоки в код C#.
1. Загружаю DOM в переменную dom
Код:
var regex = new System.Text.RegularExpressions.Regex(@"[\w\W]*");
var match = regex.Match(text);
if (match.Success) project.Variables["dom"].Value = match.Value;
Начинаю цикл. Ввожу переменную dom_int и присваиваю ей значение dom
Код:
var dom_int = project.Variables["dom"].Value;
В исходном коде находится 30 блоков, каждый из которых мне надо дополнительно пропарсить. Задачу себе поставил делать все последовательно через цикл и счетчик. Т.е. в начале цикла заново присваиваю рабочей переменной dom_int значение c DOM и беру совпадение №0 и получаю искомый код через outerhtml
Код:
// Конструктор действий, тип Get
HtmlElement he = instance.ActiveTab.FindElementByAttribute("div", "class", "aditem", "regexp", "0");
if (he.IsVoid) return -1;
// Получить значение атрибута "outerhtml"
string attribute = he.GetAttribute("outerhtml");
Этот код возвращает данные нулевого блока в dom_int, все хорошо.
Но когда циклом возвращаюсь искать второе совпадение #1, #2, #3 и т.д. ничего не находит. Переменная dom_int содержит только 0 совпадение, а начало цикла не перезаписывает DOM из dom в dom_int

Пробовал вместо 0 (последнее значение) в HtmlElement he = instance.ActiveTab.FindElementByAttribute("div", "class", "aditem", "regexp", "0"); вставить переменную счетчика project.Variables["div_counter"].Value. Однако это не помогает ProjectMaker виснет намертво
Где я что не так сделал? Как мне циклом пройтись по 30 блокам?
 

budora

Client
Регистрация
13.08.2012
Сообщения
831
Благодарностей
556
Баллы
93
Лучше покажи что надо парсить, а то так и подсказать нечего.
 

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Парсим эту страницу:
http://www.milanuncios.com/anuncios/
Надо получить innerHtml всех 30 div'ов которые начинаются и вложены в <div class="aditem">
 

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Попробовал сделать вот так
Код:
var dom_int = project.Variables["dom"].Value; //заносим DOM в рабочую переменную
string[] div_array = new String[29]; //создаем строковой массив за пределами цикла для хранения 30ти div'ов и инициализируем его
    for (int i=0; i<=29;i++) // запускаю цикл из 30 ротаций
        { // начало поиска div'ов
        HtmlElement htmlElement = instance.ActiveTab.FindElementByAttribute("div", "class", "aditem", "regexp", i);
        if (!htmlElement.IsVoid) //если элемент найден
                        { // записываем outerhtml в i элемент массива
                        array div_array[i] = htmlElement.GetAttribute("outerhtml");         // Получаю значение атрибута "outerhtml" и заношу его в i-ячейку массива div_array
                        }
        }
Сыпется куча ошибок связанных с объявлением массива. Читал доки, но так и не смог объявить массив правильно. Подскажите как надою
 
Последнее редактирование:

tka4enko.ilya

Client
Регистрация
20.10.2015
Сообщения
61
Благодарностей
9
Баллы
8
убери в цикле array перед переменной div_array
ошибки должны уйти
 

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Методом простого перебора пришел к такому коду:
Код:
var dom_int = project.Variables["dom"].Value; //заносим DOM в рабочую переменную
int i = 0;
string[] div_array = new string[29]; //создаем строковой массив за пределами цикла для хранения div'ов и инициализируем его
for (i=0; i<=div_array.Length; i++) // запускаю цикл из 30 ротаций
{ // начало поиска div'ов
    HtmlElement he = instance.ActiveTab.FindElementByAttribute("div", "class", "aditem", "regexp", i);
    if (!he.IsVoid) //если элемент найден
    { // записываем outerhtml в i элемент массива, выводим в консоль текущее значение div_array[i]
        div_array[i] = he.GetAttribute("outerhtml");// Получаю значение атрибута "outerhtml" и заношу его в i-ячейку массива div_array
        System.Threading.Thread.Sleep(500); //ждем 0,5 секунд
        Console.WriteLine (div_array[i]); //вот здесь в консоли ничего писАть не хочет почему-то...
    }
}
на пустом значении DOM скрипт исправно компилировался. Как только загрузил в DOM страницу Html, сразу стал выдавать ошибку "...OwnCode Индекс находится вне границ массива"
А еще в консоль отказывается, чертяка, выводить текущее значение div_array
 

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Есть мнение как победить?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Код:
string[] div_array = new string[29];
тут создается массив длиной не 30, а 29 элементов, для 30 элементов надо вписать цифру 30
Код:
Console.WriteLine (div_array[i]);
а откуда тут консоль может быть, если это не консольное приложение
 
  • Спасибо
Реакции: masterLomaster

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Код:
string[] div_array = new string[29];
тут создается массив длиной не 30, а 29 элементов, для 30 элементов надо вписать цифру 30
Первое значение массива - это 0, второе 1....и т.д. 29-е значение по факту является 30м.
Код:
Console.WriteLine (div_array[i]);
а откуда тут консоль может быть, если это не консольное приложение
Хорошо, а как тогда увидеть процесс и какие значения заносятся в массив?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
вместо консоли любое из трёх

Код:
project.SendInfoToLog("", div_array[i], true);
project.SendWarningToLog("", div_array[i], true);
project.SendErrorToLog("", div_array[i], true);
 
  • Спасибо
Реакции: Moromer

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
  • Спасибо
Реакции: Moromer

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113

Moromer

Client
Регистрация
16.10.2016
Сообщения
24
Благодарностей
0
Баллы
1
вместо консоли любое из трёх

Код:
project.SendInfoToLog("", div_array[i], true);
project.SendWarningToLog("", div_array[i], true);
project.SendErrorToLog("", div_array[i], true);
Спасибо. Все заработало. И все увидел.
Теперь пойду дальше по задаче ))
 

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