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

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

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 блокам?
 
Лучше покажи что надо парсить, а то так и подсказать нечего.
 
Парсим эту страницу:
http://www.milanuncios.com/anuncios/
Надо получить innerHtml всех 30 div'ов которые начинаются и вложены в <div class="aditem">
 
Попробовал сделать вот так
Код:
Развернуть Свернуть Копировать
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
                        }
        }
Сыпется куча ошибок связанных с объявлением массива. Читал доки, но так и не смог объявить массив правильно. Подскажите как надою
 
Последнее редактирование:
убери в цикле array перед переменной div_array
ошибки должны уйти
 
Методом простого перебора пришел к такому коду:
Код:
Развернуть Свернуть Копировать
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
 
Есть мнение как победить?
 
Код:
Развернуть Свернуть Копировать
string[] div_array = new string[29];
тут создается массив длиной не 30, а 29 элементов, для 30 элементов надо вписать цифру 30
Код:
Развернуть Свернуть Копировать
Console.WriteLine (div_array[i]);
а откуда тут консоль может быть, если это не консольное приложение
 
  • Спасибо
Реакции: masterLomaster
Код:
Развернуть Свернуть Копировать
string[] div_array = new string[29];
тут создается массив длиной не 30, а 29 элементов, для 30 элементов надо вписать цифру 30
Первое значение массива - это 0, второе 1....и т.д. 29-е значение по факту является 30м.
Код:
Развернуть Свернуть Копировать
Console.WriteLine (div_array[i]);
а откуда тут консоль может быть, если это не консольное приложение
Хорошо, а как тогда увидеть процесс и какие значения заносятся в массив?
 
вместо консоли любое из трёх

Код:
Развернуть Свернуть Копировать
project.SendInfoToLog("", div_array[i], true);
project.SendWarningToLog("", div_array[i], true);
project.SendErrorToLog("", div_array[i], true);
 
  • Спасибо
Реакции: Moromer
Первое значение массива - это 0, второе 1....и т.д. 29-е значение по факту является 30м.
вырезка из msdn для ясности:
int[] array = new int[5];
Массив содержит элементы с array[0] по array[4].
 
  • Спасибо
Реакции: Moromer
вместо консоли любое из трёх

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

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