Web을 돌아다니다 보면 특정한 부분의 목록만 얻고 싶은 경우가 있습니다.
예를 들어 신문 기사 싸이트의 기사 제목과 본문만 얻는 경우라던지, 그 기사의 url만 얻는다 던지 하는 경우와
혹은 어떤 특정한 html에서 이미지의 경로(url)만 필요하다던지요.
사실 script 언어를 사용해서 정규식을 이용하면 쉽게 뚝딱하고 만들 수 있습니다만,
매번 만드는 것이 귀찮아서 C#으로 범용적으로 사용할 수 있게 만들었습니다.
사용법은 (저에게는 쉽지만..) 좀 복잡합니다.
예를 들어 아래의 그림과 같이 네이버 만화에서 정글고 목록을 뽑아오게 만들고 싶다고 가정합니다.
그렇다면 제일 먼저 해야할 일이 page 넘버를 찾는 것입니다.
원래 정글고 url 은 http://comicmall.naver.com/webtoon.nhn?m=list&contentId=15640 이것이지만
위의 그림에서 2 page를 클릭하면 http://comicmall.naver.com/webtoon.nhn?m=list&contentId=15640&page=2 주소에 page=2와 같은 파라미터가 추가되는 것을 알 수 있습니다. 08년 5월 9일을 기준으로 정글고의 page는 20개까지 있네요.
그렇다면 프로그램을 실행하고 URL 입력부분을 아래와 같이 입력합니다.
여기서 주의하셔야 할 것이 page= 뒤의 붙는 숫자는 변화하는 것이기 때문에 {0}을 써주는 것입니다.
여러 페이지에 걸쳐서 (from ~ to ~) 목록을 뽑을 때는 반드시 {0} 이어야 합니다.
(단, 하나의 URL에서 목록을 뽑을 때는 고정된 URL만 넣으시면 됩니다.)
이제 찾으려고 하는 패턴을 만들어보겠습니다.
http://comicmall.naver.com/webtoon.nhn?m=list&contentId=15640 이 페이지에 소스를 보면
위의 그림과 같이 뽑고자 하는 정글고 만화의 제목과 그것의 링크 부분을 발견할 수 있습니다.
<a href="/webtoon.nhn?m=detail&contentId=15640&no=192&page=1" class="gray_a01">입시명문 사립 정글고등학교 187화 <고민상담></a>
여기서 우리가 뽑아야 할 부분은 <a href=" 다음의 문자열부터 "까지의 주소로 표현된 문자열과 class="gray_a01"> 다음의 문자열 부터 </a>까지의 제목으로 표현되는 문자열입니다.
이것을 C# 정규표현식을 사용하여 표현하면
<a href="(/webtoon.nhn\?m=detail&contentId=.*)" class="gray_a01">(.*)</a>
위와 같이 됩니다. 원하는 부분을 괄호를 사용하여 그룹핑을 반드시 해주셔야 합니다.
정규 표현식(Regular Expression)에 익숙지 않으신 분들을 위해 잠시 설명하자면
. 는 모든 문자열을 말하고
* 는 0개 이상의 반복을 말합니다.
? 는 나올 수도 있고 나오지 않을 수도 있다는 것을 말합니다.
그러나 문자열로서 ?를 사용하고 싶다면 위의 패턴처럼 반드시 역슬래시 \를 붙여서 \?와 같이 사용하여야 합니다.
() 는 괄호 안에 쌓인 문자열을 그룹으로 뽑겠다는 말입니다.
위의 그림처럼 Pattern 항목에 정규식을 입력하고, Parse 버튼을 누릅니다.
ListView에 찾은 패턴들이 주루륵 들어가게 되는데요.
0 번에는 입력한 정규식 패턴으로 찾은 문자열이 들어가게 되구요.
1 번부터는 정규식에서 ( ) 를 통해서 그룹으로 뽑은 것들이 그룹의 숫자만큼 열이 생겨서 항목이 채워지게 됩니다.
마지막으로 이 ListView의 항목들을 텍스트 파일로 Export 하는 작업인데요
위의 그림처럼 ExportPattern 항목에 {그룹번호}를 포함하여 문자열을 입력하시고 Export 버튼을 누르면
텍스트 파일 형태로 저장할 수 있습니다. (이 문자열은 정규식 패턴이 아니라 C#에서 사용하는 string format을 사용하시면 됩니다.)
{2} \t http://comicmall.naver.com{1}
위와 같이 사용하실 수도 있겠네요.
C# 문법에 익숙하시면 간단히 사용하실 수 있겠죠? ^^;;;






Parser.zip




