c# Как получить значение дочернего HTML элемента?

Получение значения дочернего HTML элемента

В одной из предыдущих статей мы рассмотрели, как получить значение HTML элемента, а сегодня хочу показать, как получить значение дочернего HTML элемента.

И так для начала работы нам понадобиться простая HTML страница, например:

<html>
<head></head>
<body>
<ul>
<li>BMW</li>
<li id="broken">Nissan</li>
<li class="ns">Toyota</li>
</ul>
</body>
</html>

Затем создадим новый проект типа Windows Forms Application и добавим на форму кнопку и control WebBrowser (wb), либо можно использовать класс WebBrowser.

Далее нам нужно загрузить HTML страницу, для этого сначала подписываемся на событие Button_Click, а затем в обработчике данного события добавляем следующий код:

private void button1_Click(object sender, EventArgs e)
{
wb.Navigate(@"url адрес");
}

Чтобы дождаться полной загрузки страницы, подписываемся на событие DocumentCompleted:

private void wb_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
}

В обработчике данного события размещаем код из любого ниже приведенного примера.

Работа с дочерними HTML элементами

На созданной нами странице содержится список, который имеет родительский элемент с тегом UL и три дочерних HTML элемента с тегом LI. Давайте рассмотрим несколько простых примеров работы с ними.

Как получить значение первого дочернего элемента?

В первом примере получим значение первого дочернего HTML элемента содержащегося в списке.

//получаем содержимое HTML документа
HtmlDocument htmlDoc = wb.Document;
//получаем все элементы с тегом ul
HtmlElementCollection elmsUL;
elmsUL = htmlDoc.GetElementsByTagName("ul");
foreach (HtmlElement elmUL in elmsUL)
{
//получаем все дочерние элементы с тегом li
HtmlElementCollection elmsLI;
elmsLI = elmUL.GetElementsByTagName("li");
for (int i = 0; i  1; i++)
{
//получаем значение первого HTML элемента
string value = elmsLI[0].InnerText;
}
}
//Результат: BMW

Так как класс HtmlElementCollection содержит индексатор, то в приведенном выше примере вместо цикла, можно сразу же обратиться по индексу к первому элементу, например следующим образом:

private void wb_DocumentCompleted(object sender, 
WebBrowserDocumentCompletedEventArgs e)
{
HtmlDocument htmlDoc = wb.Document;
HtmlElementCollection elmsUL;
elmsUL = htmlDoc.GetElementsByTagName("ul");
HtmlElementCollection elmsLI;
//обязательная проверка
if (elmsUL.Count > 0)
{
//получаем первый дочерний элемент
elmsLI = elmsUL[0].GetElementsByTagName("li");
if (elmsLI.Count > 0)
{
//Получаем значение элемента
string value = elmsLI[0].InnerText;
}
}
}
//Результат: BMW

Как получить значение дочернего элемента с атрибутом id?

Во втором примере получим значение второго дочернего HTML элемента с атрибутом id. О том, как найти элемент с атрибутом id я уже рассказывал ранее, поэтому сразу же переходим к решению задачи:

HtmlElement elmLI = wb.Document.GetElementById("broken");
if (elmLI != null)
{
string value = elmLI.InnerText;
}
//Результат: Nissan

Как получить значение дочернего элемента с атрибутом class?

И последний на сегодня пример, в котором получим значение дочернего HTML элемента с атрибутом class. Опять же более подробно о том,
как найти элемент с атрибутом class можно прочитать, перейдя по ссылке, а чуть ниже приведено готовое решение:

private void wb_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
HtmlDocument htmlDoc = wb.Document;
HtmlElementCollection elmsUL;
elmsUL = htmlDoc.GetElementsByTagName("ul");
HtmlElementCollection elmsLI;
if (elmsUL.Count > 0)
{
elmsLI = elmsUL[0].GetElementsByTagName("li");
foreach (HtmlElement elmLI in elmsLI)
{
//проверяем, содержит ли элемент атрибут class
if (elmLI.GetAttribute("classname").Contains("ns"))
{
//получаем значение дочернего элемента
string value = elmLI.InnerText;
}
}
}
}
//Результат: Toyota

На этом всё, если есть вопросы, то оставляйте их в комментариях.

Читайте также:

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*