본문 바로가기
프로그래밍/C#

[C#] 콘솔 버전 - HTML 파싱하기

by zoo10 2011. 1. 5.

이전에 윈폼으로 작업한 것을 콘솔용으로 바꿔봤습니다.

웹브라우져 컨트롤 없이 HTML 파싱해보고 싶어서 였습니다. 웹브라우져가 아무래도 리소스를 좀 잡아 먹는거 같아서 입니다. 한참 돌고 돌아서 할 수 있게 되었는데요. 이번에도 구글신의 도움을 받았네요.


생각보다 많은 자료가 있는건 아니였습니다. 데브피아에 있는 관련 질문글에 답변 내용을 보고 참고했습니다.

이번 코딩은 mshtml 이라는 네임스페이스를 참고하는 부분이 주요 부분이라고 하겠습니다.

여전히 다나와의 현금/카드 동일몰의 최저가를 찾아내는 걸로 목표를 삼았습니다. mshtml의 인터페이스들로 파싱을 할 수 있습니다.

코딩은 이전 포스팅에 있는 웹 소스 가져오기 부분과 파싱하는 부분을 적절히 섞어서(?) 작성했습니다. 웹브라우져 컨트롤 보다는 조금 복잡해 졌지만 그 원리는 같습니다.

코딩

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using mshtml;


namespace TestFileParser
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string url = "http://blog.danawa.com/prod/?prod_c=1132675&cate_c1=861&cate_c2=873&cate_c3=959&cate_c4=0";
                Console.WriteLine("Accessing {0} ...", url);
                WebRequest request = WebRequest.Create(url);
                request.Credentials = CredentialCache.DefaultCredentials;

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                Encoding encode;
                if (response.CharacterSet.ToLower() == "utf-8") { encode = Encoding.UTF8; }
                else { encode = Encoding.Default; }

                Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream, encode);

                string responseFromServer = reader.ReadToEnd();

                HTMLDocument doc = new HTMLDocument();
                doc.designMode = "on";
                object[] oPageText = { responseFromServer };
                IHTMLDocument2 oMyDoc = (IHTMLDocument2)doc;
                oMyDoc.write(oPageText);

                IHTMLTable table = (IHTMLTable)doc.getElementById("cm");
                IHTMLElementCollection trs = table.rows;
                IHTMLTableRow row = trs.item(1);
                IHTMLElement cel = (IHTMLElement)row.cells.item(2);

                Console.WriteLine("최저가 = {0}", cel.innerText);
                Console.ReadLine();

                reader.Close();
                dataStream.Close();
                response.Close();
            }
            catch (WebException e)
            {
                Console.WriteLine("주소값이 유효하지 않거나 열리지 않는 사이트입니다.\n\n" + e.Message);
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
        }
    }
}

Solution Explorer에서 mshtml을 참조 해야 합니다. 주소값을 하나만 직접 코딩에 박아 넣었지만 아마 실무에서는 무한 루프를 돌려서 써야 겠죠? ^^

DB 접근하기가 필요하겠네요. 콘솔로 DB에 접근해서 데이터를 가져오는 코딩을 하나 짜야 겠네요.
그럼 즐프하세요.

혹시 다나와의 관계자가 보시고 문제 있으시면 말씀해 주세요. 아마 보실리는 없겠죠? ^^;;