Получение значения дочернего 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
На этом всё, если есть вопросы, то оставляйте их в комментариях.
Читайте также: