Делаю парсер с последующей отправкой полученных данных по e-mail.
Весь смысл в том, чтобы сравнить данные в списке (новые данные), с данными в таблице. Если данные списка присутствуют в таблице, то берем все ячейки каждой строки и записываем их в столбик, чтобы тело письма выглядело так:
Из первой строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
----------------------------------------------- (разделитель)
Из второй строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
-------------------------------------------------------- и т.д.
КОД ПАРСЕРА
ДАЛЕЕ ИДЕТ КОД ПОИСКА СТРОК, КОТОРЫЕ НЕБЫЛИ РАНЕЕ НАЙДЕНЫ И ОТПРАВЛЕНЫ ПО ПОЧТЕ
СЕЙЧАС МНЕ ПРИХОДИТ ТАКОЕ ПИСЬМО
// System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
PS: Если работать через список и брать одно значение то все получается идеально, но мне нужно несколько значений.
И еще- не знаю как правильно добавить lock(SyncObjects.TableSyncer), чтобы все работало корректно.
Весь смысл в том, чтобы сравнить данные в списке (новые данные), с данными в таблице. Если данные списка присутствуют в таблице, то берем все ячейки каждой строки и записываем их в столбик, чтобы тело письма выглядело так:
Из первой строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
----------------------------------------------- (разделитель)
Из второй строки:
Значение 1 - значение из первой ячейки
Значение 2 - значение из второй ячейки
Значение 3 - значение из третьей ячейки и т.д.
-------------------------------------------------------- и т.д.
КОД ПАРСЕРА
Код:
lock(SyncObjects.TableSyncer) {
Tab Tab1 = instance.ActiveTab; // переменная активной вкладки браузера
var ids_parsedList = project.Lists["ids_parsed"]; //переменная спаршенных ссылок
IZennoTable tblMyData = project.Tables["MyData"]; // переменная таблицы проекта
//Объявляем коллекцию элементов и находим все нужные строки
HtmlElementCollection colRows = Tab1.FindElementsByXPath("//table[@class='es-reestr-tbl its']");
//перебираем каждую строку
foreach(HtmlElement elRow in colRows){
//получаем данные нужного элемента конкретной строки
string strCellOne = elRow.FindChildByXPath(".//span[@class='es-el-name']", 0).GetAttribute("innerHtml");
// ищем определенные слова в атрибуте нужного элемента
if ((strCellOne.Contains("СЛОВО 1") || strCellOne.Contains("СЛОВО 2")) && (strCellOne.Contains("СЛОВО 3") || strCellOne.Contains("СЛОВО 4") || strCellOne.Contains("СЛОВО 5") || strCellOne.Contains("СЛОВО 6") || strCellOne.Contains("СЛОВО 7") || strCellOne.Contains("СЛОВО 8") || strCellOne.Contains("СЛОВО 9")))
{
//Если нужные слова присутствуют в элементе строки, забираем данные из второй ячейки и по аналогии из остальных ячеек этой строки
string strCellTwo = elRow.FindChildByXPath(".//input[@content='leaf:objectHrefTerm']", 0).GetAttribute("value");
string strCellThree = elRow.FindChildByXPath(".//input[@content='leaf:objectHrefTerm']", 0).GetAttribute("value");
string strCellFour = elRow.FindChildByXPath(".//span[@format='money']", 0).GetAttribute("innerHtml");
// Записываем данные в таблицу
tblMyData.AddRow(new String[]{strCellTwo, strCellOne, strCellFour});
//записываем данные в список
ids_parsedList.Add(strCellTwo);
Код:
var ids_oldList = project.Lists["ids_old"]; // переменная списка со старыми ссылками
var ids_parsedList = project.Lists["ids_parsed"]; // переменная со спаршенными ссылками
var ids_new = project.Lists["ids_new"]; // переменная
var tblMyData = project.Tables["MyData"];
var mailBody = "";
var sendMail = false;
lock(SyncObjects.ListSyncer)
{
for(int i=0; i < ids_parsedList.Count; i++)
{
var newID = ids_parsedList[i]; // переменная в которую записываются все спарсенные ссылки
var isIdNew = true;
for(int j=0; j < ids_oldList.Count; j++)
{
var oldID = ids_oldList[j]; // переменная в которую записываются все старые ссылки
if (oldID == newID){ // сравнение ссылок в переменных
isIdNew = false;
break;
}
}
if(isIdNew){
ids_new.Add(newID); // если есть новые ссылки то добавляем их в список ids_new
for(int k=0; k < tblMyData.RowCount; k++)
{
// читаем строку из таблицы (это будет массив ячеек)
var cells = tblMyData.GetRow(k).ToArray();
// пройдем в цикле по всем ячейкам
for (int m=0; m < cells.Length; m++)
{
// проверяем содержание текста переменной newID в ячейке, если есть совпадения формируем тело письма
// ВОТ ТУТ У МЕНЯ ПРОБЛЕМА!! Я НЕ МОГУ ПОНЯТЬ КАК СФОРМИРОВАТЬ ТЕЛО ПИСЬМА, ЧТОБЫ БРАЛАСЬ КАЖДАЯ ЯЧЕЙКА И
// ЗАПИСЫВАЛАСЬ В ОТДЕЛЬНУЮ СТРОКУ, КАК Я НАПИСАЛ ВЫШЕ.
if (cells[m].Contains(newID)) mailBody = mailBody + cells + Environment.NewLine;
sendMail = true;
}
if(sendMail) project.Variables["mailBody"].Value = mailBody;
}
}
}
}
// System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
//System.String[]
PS: Если работать через список и брать одно значение то все получается идеально, но мне нужно несколько значений.
И еще- не знаю как правильно добавить lock(SyncObjects.TableSyncer), чтобы все работало корректно.