Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

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

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

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

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

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

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

예제 처럼 3가지 방법이 있다.
/// 
/// WebBrowser 에서문서가모두로드되었을때- 예제
/// 
/// 
/// 
private void webBrowser1_DocumentCompleted(object sender, 
                         WebBrowserDocumentCompletedEventArgs e)
{
    if (e.Url.AbsoluteUri == webBrowser1.Url.AbsoluteUri)
    { 
         // 작업               
    }
}
/// 
/// WebBrowser 에서문서가모두로드되었을때- 예제
/// 
/// 
/// 
private void webBrowser1_DocumentCompleted(object sender, 
			WebBrowserDocumentCompletedEventArgs e)
{
     if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
     {
        // 작업               
     }
}
/// 
/// WebBrowser 에서문서가모두로드되었을때- 예제
/// 
/// 
/// 
private void webBrowser1_DocumentCompleted(object sender, 
WebBrowserDocumentCompletedEventArgs e)
{
     // 문서가완료되지않으면isBusy 는true 이다
     if (webBrowser1.IsBusy == false)
     {
         // 작업
     }
}

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

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

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

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

내용이다.
private System.Windows.Forms.TreeView treeDOM;

treeDOM.SuspendLayout();
// HTML 분석해서TreeView 에추가하는함수
ProcessElement(webBrowser1.Document.Body.Children, treeDOM.Nodes);
treeDOM.ExpandAll();
treeDOM.ResumeLayout();
위의 내용을 구현한 함수이다
private void ProcessElement(HtmlElementCollection elements, TreeNodeCollection nodes)
{
    // elements 객체스캔
    foreach (HtmlElement element in elements)
    { 
        // 태그이름을보여주기위한노드생성
        TreeNode node = new TreeNode("<" + element.TagName + ">");
        nodes.Add(node);
        
        if ((element.Children.Count == 0) && (element.TagName != null))
        {
            // 노드아래element 에서태그에포함된Text 를추출한후추가한다.
            node.Nodes.Add(element.InnerText);
        }
        else
        { 
            // 노드아래에자식요소가없으므로재귀호출하여진행한다
            ProcessElement(element.Children, node.Nodes);
        }
    }
}

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

// 각부모요소안의모든태그추출
foreach (HtmlElement element in elements.All)
{ 
    // 특정태그목록추출
    switch (element.TagName.ToUpper())
    { 
        case "IMG":
            // 이미지경로출력
            MessageBox.Show(element.GetAttribute("SRC"));
            break;
        case "A":
            // 링크경로출력
            MessageBox.Show(element.GetAttribute("HREF"));
            break;
        case "LINK":
            MessageBox.Show(element.GetAttribute("HREF"));
            break;
    }
}
반응형
Posted by 녹두장군

댓글을 달아 주세요

  1. kpro 2010.01.14 08:58  댓글주소  수정/삭제  댓글쓰기

    감사합니다~ msdn에 그렇게 자세히 나와있지 않아 고생하고있었습니다.

  2. paper 2010.11.16 17:04  댓글주소  수정/삭제  댓글쓰기

    감사합니다..
    코드를 작성해서 테스트를 했는데 body부분이 반복 되어 tree에 출력 됩니다. 이부분은 어떻게 처리를 해야 하는지요?

  3. C# 2017.06.24 01:15  댓글주소  수정/삭제  댓글쓰기

    elements.ALL 여기서 오류나는데 ALL속성이 있는지요..