제2외국어/Windows

[C#]html, 정규식을 이용한 파싱( using Regex )

윈플. 2013. 7. 24. 17:33

크롤링하는 웹 사이트 UI가 바뀔 때마다 업데이트 되는 ㅠㅠ


먼저 간단히 정규식 패턴을 적용할 수 있는 Firefox의 부가기능을 소개하겠습니다.

"HTML Regex Data Extractor"
: Firefox - 부가 기능 - 'Regex' 로 검색 후 설치

[ 사용법 ]

1. Alt + R 로 툴을 시작합니다.

2. 원하시는 웹 사이트로 이동 후에 Ctrl + U 또는 마우스 오른쪽 버튼을 누른뒤 페이지 소스 보기를 누릅니다.
   그리고 소스를 "Content" 안으로 복사를 합니다.

Google Play를 기준으로 진행하겠습니다.

3-1. "Pattern"에 간단하게 추천 앱들의 이름을 알아내는 패턴을 적어보겠습니다.

ex ) <a class="title" title="Umano: News Read to You" href="/store/apps/details?id=com.sothree.umano"> 
      위와 같은 형식에 'title' 클래스 안에 'title'에 들어있습니다.
      제 부족한 정규식 능력에 한번에 뽑기는 어렵습니다. 'title'을 포함하는 문장 전체를 뽑습니다.
      <a class="title" [^>]*>  : 'title' 클래스의 < ~ > 문장을 다 뽑는 정규식 입니다.


3-2. 위 패턴으로 뽑은 결과값을 다시 한번 패턴으로 분류하기 위해, "Result" 내용을 "Content"로 옮깁니다. 
      그리고 다시 한번 패턴으로 뽑습니다.

      title=.*"    : title= 다음 " 표시까지 글을 뽑는 정규식입니다.


4. 결과값을 살펴보겠습니다.

[0] : title="Umano: News Read to You"
[1] : title="WhosCall(후스콜) - 발신자식별 및 차단"
[2] : title="Space Colony"
[3] : title="Flipboard: 여러분의 소셜 뉴스 매거진"

이 정도면 충분히 코딩으로 title만 뽑아낼 수 있습니다.  



C# 에서 위에서 뽑은 정규식을 토대로 실제로 Title을 뽑겠습니다.

먼저 정리를 하자면, Title을 뽑기 위한 두 가지 패턴이 있었습니다.
1차 패턴 : <a class="title" [^>]*>
2차 패턴 :  title=.*"


// 해당 url의 html 소스를 가져오는 부분입니다.
string
url = "https://play.google.com/store/apps";

string html = GetResponse(url);

string strPatternOne = "<a class=\"title\"[^>]*>";
string strPatternTwo = "title=.*\"";


// Regex 와 
MatchCollection 를 이용해서 패턴으로 분류합니다.             

Regex regex = new Regex(strPatternOne);
MatchCollection mc = regex.Matches(html);

foreach (Match m in mc)
{
        
// 첫번째 패턴으로 뽑아낸 데이터를 저장합니다..
        arrPattern[count++] = m.ToString();
}

for (int i = 0; i < count; i++)
{ 
        // 한번 더 정규식으로 뽑아내기 
        string strTemp = System.Text.RegularExpressions.Regex.Match(arrPattern[i], strPatternTwo).ToString();
        arrPattern[i] = strTemp;
}


// 위에서 사용된 함수원형입니다.
public
static string GetResponse(string url)

{
            HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
            HttpWebResponse response = (request.GetResponse() as HttpWebResponse);

            StreamReader reader = new StreamReader(response.GetResponseStream());
            return reader.ReadToEnd();
}


System.Text.RegularExpressions.Regex.Match( );  ||  MatchCollection 을 이용한 방법
: 두 개의 방법 모두 사용해봤습니다. 편하신 걸로 골라 쓰시면 됩니다.
System.Text.RegularExpressions.Regex.Matches() 도 물론 있습니다.


PS. 사실 정규식 규칙에 대해서도 적고 싶지만, 사용할 때마다 헷갈리는 부분이라....




'제2외국어 > Windows' 카테고리의 다른 글

[C#] 간단한 매크로.  (0) 2012.08.08
[C#] WebBrower 기초. (간단한 웹브라우저 만들기)  (0) 2012.03.02
[C++] 클래스 정의.  (2) 2012.01.27
[C++] 스마트 포인터.  (0) 2011.12.27