Завершение цикла while раньше

boris.lyashuk

Client
Регистрация
07.07.2018
Сообщения
24
Благодарностей
1
Баллы
3
C#:
HtmlElementCollection luboe_imy = null; //все HtmlElementCollection лучше объявлять в самом верху
//начало: подключение таблицы
var package = new ExcelPackage(new FileInfo(@"F:\Зенопостер\ЗЕНО уроки\Tabl_3.xlsx")); //путь к табличке
ExcelWorksheet tabletest = package.Workbook.Worksheets[1]; //где tabletest - имя(любое) – лучше вообще никогда не менять, а 1 - номер листа в excel
//конец: подключение таблицы
int q = 0; //объявляем 
int w = 0; //объявляем
int b = 0; //объявляем 
var List1 = project.Lists["List1"];// объявляем пер List1 равную списку
while (true)//запускаем  цикл
{
project.Variables["List1"].Value = List1[0];// в переменную проекта List1 кладем первую строку 
instance.ActiveTab.Navigate(project.Variables["List1"].Value);// переходим на страницу из переменной проекта List1
instance.ActiveTab.WaitDownloading(); //дожидаемся загрузки страницы
List1.RemoveAt(0);//удаляем строку
luboe_imy = instance.ActiveTab.FindElementsByXPath("//*[@class='name']");//парсим : Xpath путь
for(int v=0; v<luboe_imy.Count; v++) //цикл перебора найденных элементов. luboe_imy.Count означает, что цикл будет крутиться до тех пор, пока не закончатся все найденные нами элементы
       {
  string ssylk = luboe_imy.GetByNumber(v).GetAttribute("innertext"); //кл в переменную ssylk атрибут innertext нашего элемента
  project.SendInfoToLog(ssylk); //выводим в лог для самопроверки
        b++; //увеличиваем на 1 счетчик строк
  tabletest.SetValue(b,3, ssylk); //записываем данные в таблицу: строка, столбец, что записываем   
       }
luboe_imy = instance.ActiveTab.FindElementsByXPath("//img[contains(@id,'post')]");//парсим : Xpath путь       
for(int v=0; v<luboe_imy.Count; v++) //цикл перебора найденных элементов. luboe_imy.Count означает, что цикл будет крутиться до тех пор, пока не закончатся все найденные нами элементы
       {
  string ssylk = luboe_imy.GetByNumber(v).GetAttribute("id"); //кл в переменную ssylk атрибут innertext нашего элемента
  project.SendInfoToLog(ssylk); //выводим в лог для самопроверки
        q++; //увеличиваем на 1 счетчик строк
  tabletest.SetValue(q,4, ssylk); //записываем данные в таблицу: строка, столбец, что записываем   
       }   
    luboe_imy = instance.ActiveTab.FindElementsByXPath("//div[contains(@class,'postbody')]");//парсим : Xpath путь   
    for(int v=0; v<luboe_imy.Count; v++) //цикл перебора найденных элементов. luboe_imy.Count означает, что цикл будет крутиться до тех пор, пока не закончатся все найденные нами элементы
       {
  string ssylk = luboe_imy.GetByNumber(v).GetAttribute("outerhtml"); //кл в переменную ssylk атрибут innertext нашего элемента
  project.SendInfoToLog(ssylk); //выводим в лог для самопроверки
        w++; //увеличиваем на 1 счетчик строк
  tabletest.SetValue(w,5, ssylk); //записываем данные в таблицу: строка, столбец, что записываем
       }   
package.Save(); //сохраняем в таблицу 
}
Слепил тут код. Может и горбатый, так как только разбираюсь в С#. Вроде работает, но иногда из цикла выходит раньше. В чем может быть дело?
Обрабатывается порядка 4000 строк из листа.
После запуска может обработать 1000 а может и 500 а может и 2000.
Нет никакой логики в завершении цикла.
Входные данные не меняются.
Запускаю после выхода, код продолжает работать.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
у тебя нет проверок элементов на null и когда делаешь .GetAttribute("innertext"); может вывалиться по красной.
по красной же выходит ?
 

boris.lyashuk

Client
Регистрация
07.07.2018
Сообщения
24
Благодарностей
1
Баллы
3
Ага по красной. Попробую. Пока что прилепил костыль возврата к циклу.
 

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