BLOG ESPERANCA

WebBrowser 컨트롤의 HTML 코드에서 DOM 객체처럼 특정 태그 내용을 추출 본문

Program/C / C++ / C#

WebBrowser 컨트롤의 HTML 코드에서 DOM 객체처럼 특정 태그 내용을 추출

yobuce 2010. 6. 9. 17:50

C# WebBrowser 컨트롤의 HTML 코드에서 DOM 객체처럼 특정 태크 내용을 추출해본다.

먼저 이 작업을 위해서는 문서가 완전히 WebBrowser 컨트롤에 로드된후에 이루어져야 할것이다.

document에 문서가 로드완료되면 DocumentCompleted 이벤트가 발생한다. 여기서 알아야

할 것은 전체 문서가 완료되면 이벤트가 발생하는 것이 아니고 프레임 단위로 일어나기 때문에

웹페이지내에 여러 개의 프레임을 포함하고 있으면 프래임 개수만큼 발생하게 된다.

이 프레임들이 모두 로드되는 시점을 체크해서 기능을 넣으면 되는데 알수 있는 방법은 아래

예제 처럼 3가지 방법이 있다.
01 /// <SUMMARY>
02 /// WebBrowser 에서문서가모두로드되었을때- 예제
03 /// </SUMMARY>
04 /// <PARAM name="sender"></PARAM>
05 /// <PARAM name="e"></PARAM>
06 private void webBrowser1_DocumentCompleted(object sender, 
07                          WebBrowserDocumentCompletedEventArgs e)
08 {
09     if (e.Url.AbsoluteUri == webBrowser1.Url.AbsoluteUri)
10     
11          // 작업               
12     }
13 }
14 /// <SUMMARY>
15 /// WebBrowser 에서문서가모두로드되었을때- 예제
16 /// </SUMMARY>
17 /// <PARAM name="sender"></PARAM>
18 /// <PARAM name="e"></PARAM>
19 private void webBrowser1_DocumentCompleted(object sender, 
20             WebBrowserDocumentCompletedEventArgs e)
21 {
22      if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
23      {
24         // 작업               
25      }
26 }
27 /// <SUMMARY>
28 /// WebBrowser 에서문서가모두로드되었을때- 예제
29 /// </SUMMARY>
30 /// <PARAM name="sender"></PARAM>
31 /// <PARAM name="e"></PARAM>
32 private void webBrowser1_DocumentCompleted(object sender, 
33 WebBrowserDocumentCompletedEventArgs e)
34 {
35      // 문서가완료되지않으면isBusy 는true 이다
36      if (webBrowser1.IsBusy == false)
37      {
38          // 작업
39      }
40 }

이제 WebBrowser 문서로드가 완료된 시점에서 HTML 을 분석한다.

그리고 분석한 내용을 바탕으로 특정 태그를 추출해본다.

아래의 예제는 재귀호출로 구현된 함수이며 webBrowser.Document.Body.Children

넘어온 HTML 태그를 분석해서 태그이름과 내용을 쌍으로 TreeView Control 에 추가하는

내용이다.
1 private System.Windows.Forms.TreeView treeDOM;
2   
3 treeDOM.SuspendLayout();
4 // HTML 분석해서TreeView 에추가하는함수
5 ProcessElement(webBrowser1.Document.Body.Children, treeDOM.Nodes);
6 treeDOM.ExpandAll();
7 treeDOM.ResumeLayout();
위의 내용을 구현한 함수이다
01 private void ProcessElement(HtmlElementCollection elements, TreeNodeCollection nodes)
02 {
03     // elements 객체스캔
04     foreach (HtmlElement element in elements)
05     
06         // 태그이름을보여주기위한노드생성
07         TreeNode node = new TreeNode("<" + element.TagName + ">");
08         nodes.Add(node);
09           
10         if ((element.Children.Count == 0) && (element.TagName != null))
11         {
12             // 노드아래element 에서태그에포함된Text 를추출한후추가한다.
13             node.Nodes.Add(element.InnerText);
14         }
15         else
16         
17             // 노드아래에자식요소가없으므로재귀호출하여진행한다
18             ProcessElement(element.Children, node.Nodes);
19         }
20     }
21 }

다음 예제는 특정 태그를 추출하고자 할 때 쓰일만한 예제이다

01 // 각부모요소안의모든태그추출
02 foreach (HtmlElement element in elements.All)
03
04     // 특정태그목록추출
05     switch (element.TagName.ToUpper())
06     
07         case "IMG":
08             // 이미지경로출력
09             MessageBox.Show(element.GetAttribute("SRC"));
10             break;
11         case "A":
12             // 링크경로출력
13             MessageBox.Show(element.GetAttribute("HREF"));
14             break;
15         case "LINK":
16             MessageBox.Show(element.GetAttribute("HREF"));
17             break;
18     }
19 }