본문 바로가기

카테고리 없음

Parsing HTML in Microsoft C#

출처 : http://www.developer.com/net/csharp/article.php/2230091/Parsing-HTML-in-Microsoft-C.htm



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using HTML;

using System.IO;


namespace ParseHTMLTester

{

    class Program

    {

        static void Main(string[] args)

        {

            StreamReader reader = new StreamReader("1.txt");// html을 1.txt로 저장해 놓음

            HTML.ParseHTML parse = new HTML.ParseHTML();


            // 스트림 리터에서 파일 전체를 string으로 변경

            string data = reader.ReadToEnd();

            parse.Source = data;


            while (!parse.Eof())

            {

                char ch = parse.Parse();

                if (ch == 0)

                {

                    AttributeList tag = parse.GetTag();

                    if (tag.Name == "th")

                    {

                        // th일 경우 class의 값을 프린트

                        if (tag["class"] != null)

                        {

                            Console.WriteLine("th class=" + tag["class"].Value);

                        }

                    }

                    else

                    {

                        // 일반 태그는 그냥 프린트

                        Console.WriteLine(tag.Name);

                    }

                }

            }

        }

    }

}

[ HTML Parser 사용법 ]

ParseHTML parse = new ParseHTML();
parse.Source = page;
while(!parse.EOF())
{
    char ch = parse.Parse();
    if(ch ==0)
    {
      AttributeList tag = parse.GetTag();
      if(tag["href"]!=null)
        System.Console.WriteLine("Found link : " +tag["href"].Value);
    }
}

ParseHTML 객체는 인스턴스화 되었고, 객체 소스 프로퍼티는 파싱될 HTML page 로 지정되었다.
루프는 페이지가 끝날때 까지 계속되고, 각태그를 찾을 때까지 다른 일반적인 문자들은 무시된다.
(ch ==0 이 될때까지.)
각 tag 에서 href attribute를 찾아서, 해당링크를 보여주게 된다.

[ The Attribute Class ]

이클래스는 각 HTML Attribute를 저장하기 위해서 사용한다.

예를 들어

<img src="picture.gif" alt="some Picture">


이 tag의 경우, attribute 는 src 와 alt 가 되고,
각 attribute 의 value 는 picture.gif 와 some Picture 이 된다.

attribute는 3가지 property를 가지는데, name, value, delim 이다.
name 은 attribute의 이름, value 는 그 값을 저장하고, delim은 value의 한계를 정하는데 사용된다.


The AttributeList Class

HTML의 경우 종종 몇개의 Attribute로 이루어지는데,
이 클래스는 그런 Attibute의 리스트를 저장한다.

이 AttributeList 클래스는 name 과 attribute의 collection으로 이루어진다.
AttributeList 는 숫자와 인덱스로 각각의 attribute에 접근이 가능하다.
위 예에서, attribute 인 src 같은 경우 AttributeList에서 접근을 하려면

theTag[0]
theTag["src"]

로 가능하다.


[ The Parse Class ]

HTML을 파싱하려고 클래스를 사용하려고 한다면, 이 Parse 클래스를 사용할 필요가 없다.
이 Parse 클래스는 HTML, SGML, XML나 HTTP header 같은 attribute-value 를 기반으로 하는 파일들을 low-level에서 제공하기 위해 HTML parser 내부적으로 사용이 되어지는 클래스이기 때문이다.


[ The ParseHTML Class ]

이 ParseHTML 클래스는 Parse 클래스의 subclass 이다. 이 ParseHTML 클래스는 HTML 파싱을 하기 위한 특별한 코드들을 제공한다.
이 ParseHTML 클래스는 HTML parser 의 주 인터페이스가 될것이다.
주로 사용될 메소드는

public char Parse()
public AttributeList GetTag()

Parse 메소드의 경우, HTML 에서 파싱한 다음 문자를 회수하게 된다.
만약, 다음 문자가 tag의 부분이라면 0 이 리턴된다.
Parse() 가 0 을 리턴한다면, HTML tag를 처리해야 한다.
tag에 접근을 하려면 GetTag 메소드를 사용하면 된다.
GetTag() 메소드의 경우 ArrayList 객체를 리턴하게 되는데,
이 객체에는 tag과 attribute가 전부 들어가 있다.



[ The FindLinks Class ]