본문 바로가기

IT/Visual Basic

[강좌] 정규식 파싱 강좌 (WinHttp 이용)

WinHttp를 이용한 정규식 파싱 강좌를 해볼께요~

 

'MNet Top 100' 파싱입니다.

 

고구마S의 피엑스(px2007)님의 자료를 이용하여, 강좌를 썼으며. 정규식에 관한 강좌가 얼마 없기에 올립니다.

그리고, 허락없이 피엑스(px2007)님의 자료를 이용해 강좌를 만든점 죄송합니다.

고구마S의 피엑스(px2007)님이 올리신 자료 : http://cafe.naver.com/gogoomas/144278

 

 

*PS. 피엑스(px2007)님의 자료에서 하나(앨범명) 추가 하였습니다.

 

  정규식은 'split' 함수 보다 정확한게 장점입니다.

단 단점은, 'split'함수보다는 조금 느리다는점이지요.

 

아래 이미지는 완성된 이미지 입니다.

 

 

 

일단 비베를 켜고, 프로젝트(P) - 참조(N)을 눌러주세요.

 

 

 그리고 'Microsoft WinHTTP Services, version 5.1'과

'Microsft VBScript Regular Expressions 5.5'를 체크 해주세요.

 

 

그리고 아래 사진과 같이 파싱을 해줍니다.

 

Dim Http As New WinHttprequest

Dim RegExp As New RegExp, Match As MatchCollection

 

 

 

 

다음과 같이 코딩해줍니다.

 

Function Search(tv As TreeView, Img As ImageList)
tv.ImageList = Nothing
tv.Nodes.Clear
Img.ListImages.Clear
http.Open "GET", "http://www.mnet.com/chart/TOP100", True
http.Send
http.WaitForResponse

 

Dim Result$
Result = Replace(http.ResponseText, vbCrLf, vbNullString)

* 설명 :

 

위에 코딩중에서 'Result = Replace(http.ResponseText, vbCrLf, vbNullString)' 부분은

 

공백과 엔터를 없애는 부분입니다. 이게 없다면 파싱이 오류가 납니다.

 

 

그리고 'MNet Top 100' 으로 들어가줍니다.

 

 

그리고 소스보기를 봐줍시다. 그리고 추천 노래인 최상위의 'Only One - 보아' 노래를 찾아야겠죠?

소스보기 창에서 찾아줍시다.

 

 

그리고 잘라야 될 부분을 찾구요. 이것들은 메모장이라던지 따로 적어놓습니다.

 

 

 

 

위에서 말씀 드렸듯이, 정규식의 장점은 정확한것이지만

단점은 'split'함수보다 조금 느리다는 단점을 가지구 있습니다.

그리고 또 다른 단점은, 짜르자 하는 부분 부터 순서대로 쭉 짤라야 합니다.

 

예를 들자면,

 

<a href="http://ltrim.tistroy.com">VbNullString's Blog</a><img src="이미지주소">

 

이것을 'split'함수 같은 경우는 자기 마음대로 순서 상관없이 자를 수 있지만.

 

예)

img = split(split(temp,"img src=""")(1),""">")(0)

title = split(split(temp,""">")(1),"</a>")(0)

 

정규식은 차례대로 순서적으로 짤라야 합니다.

 

예)

With RegExp

.Patten = """>(.*?)"<₩/a>.*?img src₩=""(.*?)"">"

 

이런식인겁니다. 말이 좀 길어졌군요.

 

이제 자를 부분을 찾습니다.  이미지부분입니다.

 

http://cmsimg.mnet.com/clipimage/album/  부터 alt=" 사이를 잘라줘야겠네요.

 

노래 제목 을 찾아야 겠죠. 'Only One' 이라고 쓰여있는부분을 찾습니다.

 

찾으셨으면 자를부분을 정합니다. class="music"> 부터 </a> 까지 짤라줘야겠군요.

 

 

이부분은 가수명 부분.

 

target="_self"> 부터  < 까지 짤라주면 되겠네요.

 

 

앨범명 부분

 

target="_self" title = " 부터 " 까지 짤라줍시다.

 

아니면 간단하게  title =" 부터 " 까지 짤라도 됩니다.

 

 

이제 코딩차례

 

With RegExp
    .IgnoreCase = False
    .Global = True

 

까지 써줍니다. 그리고 여태것 가져올 부분을 따로 적어놓으셨을텐데.

 

그것들을 적어줄 차례입니다.

 

참고로 특수 문자 같은 경우에는 ₩ 처리 해줘야합니다.

그리고 공백(스페이스) 부분 역시도 '₩s' 처리 해줘야 합니다.

 

.Pattern = "http://cmsimg.mnet.com/clipimage/album/(.*?)₩s₩salt.*?class₩=""music"">(.*?)<₩/a>.*?target₩=""_self"">(.*?)<.*?title₩s=""(.*?)"""

    Set Match = .Execute(Result)
End With

 

이제 위의 사진과 같이 코딩하면 끝납니다.

설명해드리겠습니다.

 

 

이미지를 담기위해 아래처럼 코딩해줍니다.

 

Dim i&, Temp() As Byte

'이것은 'Temp'이미지를 담을 것입니다.

아래에 설명해드리겠습니다.
For i = 0& To Match.Count - 1

'0부터 Match.Count -1 만큼 돌린다.

 

'for' 함수를 이용해 반복해주는것입니다.

 

 

http.Open "GET", "http://cmsimg.mnet.com/clipimage/album/" & Match.Item(i).SubMatches(0), True
http.Send
http.WaitForResponse

Temp = http.ResponseBody

Open App.Path & "\Temp.jpg" For Binary Access Write As #1
    Put #1, , Temp
    Close #1

'Http함수를 이용해 "http://cmsimg.mnet.com/clipimage/album/" & Match.Item(i).SubMatches(0) 을 엽니다.

'Match.Item(i).SubMatches(0)은 위에 사진이 잘못됬지만, 앨범 이미지 주소 입니다.

'http.WaitForResponse 기다립니당.

'그리고 Temp 에 ResponseBody를 담습니다.

'그리고 Open문을 이용해 App.Path & "\Temp.jpg 라는 경로를 엽니다.

'* TIP : App.Path - 실행 파일 위치

'Put함수를 이용해 #1 즉 열었던 해당 파일에 Temp를 담습니다.

'Close #1 그리고 파일을 닫죠

 

이제 TreeView에 담을껍니다.

 

Img.ListImages.Add i + 1, "img" & i, LoadPicture(App.Path & "\Temp.jpg")

'ImageList에 다운 했던 경로의 이미지를 담습니다.
tv.ImageList = Img

'그리고 TreeView의 이미지 경로를 설정해줍니다.
tv.Nodes.Add , , "img" & i, Match.Item(i).SubMatches(1) & " - " & Match.Item(i).SubMatches(2) & " [앨범명:" & Match.Item(i).SubMatches(3) & "]"

'이제 TreeView를 추가해줍니다. Key(키) 부분은 "Img" + i 로 설정

'그리고 Match.Item(i).SubMatches(2) & " [앨범명:" & Match.Item(i).SubMatches(3) & "]" 를 코딩합니다.

'제목을 설정하는겁니다.

 

tv.Nodes(i + 1).Image = Img.ListImages(i + 1).Index

'그리고 TreeView에 이미지를 설정해주죠.
Next i

'For문을 닫습니다.
Set RegExp = Nothing

'그리고 RegExp를 초기화시킵니다.

 

이렇게 코딩하면 모든것이 끝납니다. 그리고,

이미지 지우는 코딩은 알아서 하실 수 있을 것이라 믿겠습니다.

 

자 이렇게 해서 강좌를 마치겠습니다.

 

 

당신의 덧글 하나가 글쓴이의 희망이 됩니다.. 덧글 하나 남겨주시는게 그렇게 힘드세요?

Copyright(C) Ltrim 2012, All Right Reserved.