// Чистим куки.
instance.ClearCookie();
// Загружаем страницу с нужной нам таблицей.
Tab tab = instance.ActiveTab;
if ((tab.IsVoid) || (tab.IsNull)) return -1;
if (tab.IsBusy) tab.WaitDownloading();
tab.Navigate("http://www.aircraftspruce.com/catalog/appages/fairing.php", "");
if (tab.IsBusy) tab.WaitDownloading();
// Подключаем таблицу в которую будем сливать все спарсенные данные.
// Таблица должна быть смонтирована в проект. Файл таблицы должен быть создан заранее и находиться
// в одной директории с файлом проекта.
IZennoTable tableXLS = project.Tables["aircraftTable"];
// Проверяем имеется ли на странице интересующая нас таблица. В случае, если таблицы нет дальнейшее
// выполнение сниппета (кода) будет прекращено, управление будет передано на следующий блок проекта.
if (tab.FindElementByXPath("//table[@id=\"popup_table\"]", 0).IsVoid)
{
return "Таблица с доп. деталями отсутствует";
}
// Считаем количество актуальных строк в таблице.
// Заголовок таблицы не учитываем.
int rowsCount = tab.FindElementsByXPath("//table[@id=\"popup_table\"]/tbody/tr").Count;
// Считаем количество столбцов с актуальной информацией в таблице.
// Т.к. количество столбцов у таблиц на разных страницах является переменным, критерием отбора делаем заголовок.
// Учитываем все столбцы с первой позиции, пока не поймаем столбец с заголовком "Buy". Начиная с него все последующие
// столбцы не содержат никакой информации, предполагают только кол-во единиц товара и подсчёт промежуточной суммы.
// Заголовки сразу пишем в результирующую таблицу.
int columnsCount;
int i = 1;
do
{
string tableHeader = tab.FindElementByXPath(String.Format("//table[@id=\"popup_table\"]/thead/tr/td[{0}]", i),0).InnerHtml.Trim();
if (tableHeader == "Buy") break;
tableXLS.SetCell(i - 1, 0, tableHeader);
i++;
}
while (tab.FindElementByXPath(String.Format("//table[@id=\"popup_table\"]/thead/tr/td[{0}]", i),0).InnerHtml.Trim() != "Buy");
columnsCount = i;
// Теперь, зная количество столбцов и строк в таблице из которых нам надо спарсить инфу, по очереди обходим каждую ячейку.
for (int w = 1; w <= rowsCount; )
{
for (int y = 1; y <= columnsCount; )
{
string value;
// В каждой ячейке надо делать проверку на входящие элементы, т.к. в некоторых таблицах попадаются ячейки с гиперссылками
// которые при парсинге будут взяты целой строкой вместе со всеми тегами. Кроме того ячейки с ценой так же имеют текст,
// завёрнутый в тег болд.
if (tab.FindElementByXPath(String.Format("//table[@id=\"popup_table\"]/tbody/tr[{0}]/td[{1}]", w, y),0).GetChildren(false).Count == 0)
{
value = tab.FindElementByXPath(String.Format("//table[@id=\"popup_table\"]/tbody/tr[{0}]/td[{1}]", w, y),0).InnerHtml;
}
else
{
value = tab.FindElementByXPath(String.Format("//table[@id=\"popup_table\"]/tbody/tr[{0}]/td[{1}]", w, y),0).FirstChild.InnerHtml;
}
// Пишем каждое значение в результирующую таблицу.
tableXLS.SetCell(y - 1, w, value);
y++;
}
w++;
}
return "Таблица обработана";