바트 크롤러 정규식 작성하기2

공부하기/웹2017.09.08 22:54

1. 바트크롤러 정규식 작성하기2

정규식 작성전 다운받을 파일

regex-coach.exe


정규식을 작성하기 위해서는 정규식에 대해서 간략한 이해가 필요합니다.

아래는 위키백과에서 퍼왔습니다.

정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp[1] 또는 regex) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.

특정 문자열을 찾는데 도움을 주는 표현식이라는 내용을 담고 있네요.

특정문자열을 찾아야하는 이유가 무엇이냐. 소스코드는 특히 게시판 소스코드는 반복적인 형태를 이룰 수 밖에 없습니다.

우리가 자료를 게시판에 저장하면 그 자료는 차곡차곡 데이터베이스에 저장이 되는데 이걸 다시 게시판 형태로 보여주는 것이 웹입니다.

게시판 또한 프로그래밍 된 자료를 규격에 마추어 보여주는 도구라는 것이죠.

1부에서 보여드렸던 소스를 보겠습니다.


반복되는 게시판 부분 소스입니다.

더보기


소스가 많아서 정신없죠?

자세히 보시면 반복적으로 똑같이 등장하는 부분이 있습니다 하나씩 뜯어 봅시다.


<li class="list-item">

<div class="wr-num hidden-xs">435</div>

<div class="wr-subject">

<a href="http://ddssdd.co.kr/bbs/board.php?bo_table=t1&amp;wr_id=4260" class="item-subject">

<span class="wr-icon wr-new"></span>[일베] 맥주국에서 맥주 만든다 이기야</a>

<div class="item-details text-muted font-12 visible-xs ellipsis">

<span><i class="fa fa-eye"></i> 0</span>

<span>

<i class="fa fa-clock-o"></i>

<span class="orangered">25분전</span></span></div></div>

<div class="wr-date hidden-xs">

<span class="orangered">20:31</span>

</div>

</li>


제가 보기엔 이게 계속 반복적으로 나오고 있는 부분인 것 같습니다.

li 는 목록을 만드는 태그 입니다. li로 시작해서 li로 끝나는데 게시판 글 한개를 목록으로 보여주기 위한 단을 나누기 위해서 li를 사용했습니다.

여기서 우리가 긁어올 파싱할 부분은 바로 

<span class="wr-icon wr-new"></span>[일베] 맥주국에서 맥주 만든다 이기야</a>

이 부분이 되겠죠?

빨간 부분이 긁어올 내용입니다.


위에서 올려드린  regex-coach.exe

설치 하시면 요렇게 생겼습니다.

2번에 우리가 가져온 소스를 집어 넣으시면 되는데 소스 길이가 길면 길수록 오류가 잘나는거 같습니다. 적당한 선에서 A4 한페이지 정도 잘라서 가져온 다음에 작업 다하시고 전체 소스 긁어서 확인하시기 바랍니다.

1번은 정규식을 집어 넣는 부분입니다.

2번에 일단 소스를 집어 넣습니다.

그 다음 정규식을 작성하면 되는데 정규식에 대해서 아직까지 아무것도 설명을 안드렸네요! ㅜㅜ


정규식은 다음과 같습니다.



도표만 보시면 이해가 안갈겁니다. 저도 그랬으니까요.

간단히 설명 드리자면 정규식 = 소스코드 라고 이해하시면 됩니다.

소스코드에서 " " 이런 공백이 있으면 공백은 "\s" 와 같은 의미 입니다.

\s (공백)

 

<li class="list-item"> 이부분을 정규식으로 표현하자면 <li\sclass="list-item"> 이것과 같습니다. 확인해 볼까요?

화면을 보시면 노랗게 표시되는 것은 내가 작성한 정규식을 아래 문서에서 찾았다 라는 의미 입니다. scan from을 누르시면 내가 작성한 정규식과 같은 다음 소스로 넘어가게 됩니다. 마치 한글 검색에서 다음 같은 단어 찾기와 비슷합니다.

물론 같은 <li class="list-item"> 부분이 있을 때만 말이죠. 없다면 나오지 않습니다.

정규식에서 공백은 \s 라는것을 배우셨습니다. 제가 보여드린 도표에서 \s 는 공백인 문자를 찾는다고 되어 있죠?


두번째는 단일 문자가 아닌 문자에 대한 처리 방법을 보도록 하겠습니다.


소스 코드를 보시면 공백이 하나가 아닌 엔터를 친부분이 있는데 이부분을 일일히 \s를 써서 처리해주려면 공백이 몇번 뛰어져 있는지 알아야합니다. 하지만 바보 같이 그렇게 하면 너무 어렵죠.

\s+ (한개 이상의 공백)

공백이 몇개 일지 모를때 1개 이상이다. 일때 "+"를 사용합니다. 

다음 "<"까지 노란줄이 표시된걸 알수 있습니다. 

이렇게 소스코드를 정규식으로 바꿔주는 부분을 소스에서 한부분을 찾는 것입니다.

이부분이 잘못될 경우 파싱이 잘못되는 경우가 많습니다.

예를 들자면 방금과 같이 <li\sclass="list-item"> 이 부분이 게시판 소스를 긁어 오는 부분이 아닌 곳을 긁게 된다면 컴퓨터 로서는 어느 부분을 찾으라고 하는지 알수가 없습니다.

정규식 작성에서 중요한 부분에 게시물에서 중복되는 소스코드를 확인하는 방법입니다.

중복되는 부분을 발췌해오는 것임으로요.

현재까지 알려드린 정규식은 공백과 ?개 이상 인지 알수 없으니 +를 사용하는 두가지를 배웠습니다.

사실 정규식에서 사용하는 여러 표현들이 있지만 우리가 배워야 할 것은 바트 크롤러를 위한 것 이잖아요.

이제 조금 속도를 붙여서 긴 정규식을 만들어 보겠습니다.

설명을 하나하나 하려니 설명할게 너무 많아서 한꺼번에 보여드리고 설명 드리고 질문을 받도록 하죠!

앞서 보여드린 소스코드에서 다시 시작합니다. 원래 <li\sclass="list-item"> 이부분 파싱햇던 부분은 지우고 제목 부분 부터 가져오겠습니다.


<div class="wr-subject">

<a href="http://ddssdd.co.kr/bbs/board.php?bo_table=t1&amp;wr_id=4260" class="item-subject">

<span class="wr-icon wr-new"></span>[일베] 맥주국에서 맥주 만든다 이기야</a>


제목 부분은 이거죠. 제목 부분에 </span>(.+?)</a>

정확히 긁어와 졌네요?

노란색은 정규식과 같은 부분을 표시해주는 색깔이고 주확색은 그룹화(가져올내용) 부분입니다. 참고로 주황색으로 표시되지 않는 분들은 하단에 hilight에서 1번을 누르면 1번 그룹을 선택한것입니다. 그룹이 2개가 되면 2번 버튼도 활성화 됩니다.

() 괄호는 그룹화 라고 하며 바트 파싱기에서 가져올 내용인 부분입니다. ()가 여러개인 경우 순서대로 첫번째 것을 1번 두번째 괄호를 2번으로 생각하면 됩니다.


세번째로 알아볼 정규식 표현법은 "." 입니다.

어떠한 문자 1개를 "." 으로 표현합니다.

그럼 이제 배운 내용 토대로 ( ) 그룹화 "." 문자 한개 "+" 한개 이상이다 를 합하면 어떤 뜻일까요?

</span> 뒤에 있는 것부터 내용을 가져 오는데 그 내용은 문자가 1개 이상이다 입니다.

윗 사진에서 </a> 부분이 좀 깨져 보이는데 한글을 사용하면 그런듯 합니다.

(.+?) 한개 이상의 문자


이제 내용을 파싱할 수 있게 되었습니다. 헌데 내용을 파싱하다보면 내가 가져오기 싫은 것들이 있는데 그 부분만 빼고 가져오고 싶다. 근데 그부분이 매번 바뀌어서 어떻게 해야 하지 라는 생각을 할때가 있습니다.

<span class="wr-icon wr-new"></span>[일베] 맥주국에서 맥주 만든다 이기야</a>

여기 제목에서 보면 [일베]라는 부분이 그렇죠.

언뜻 생각해보면 </span>\[일베\](.+?)</a> 일베 부분까지 정규식으로 쓴 후 뒷부분을 그룹화 하면 될수 있지 않나 싶지만 게시글이 
(특수문자를 쓰려면 정규식에서는 특수문자 앞에 \를 적어줘야 인식을 합니다.)

어떤건 [일베]이고 어떤건 [새글] 이고 어떤건 [웃대]일 경우에는 이걸 일일히 분류해야 하는데 그 부분만 삭제 하기 위해서는

( ) 그룹화를 한후에 그 그룹이 있을수도 있으며 없을수도 있지만 사용하지 않는다 라고 정의 해주시면 됩니다.

그렇다면 정규식은 이렇게 됩니다.

</span>(?:[^\s]+)?(.+?)</a>

갑자기 정규식이 굉장히 어려워 졌죠? 

하지만 모든건 위에 적어 드린 표에 다 나와 있는 부분이랍니다. ㅎㅎㅎㅎㅎ


자 풀어 봅시다. 그룹화 앞에 있는 ?:는 이 그룹화는 캡쳐 하지 않겠다 라는 의미 입니다. 사용하지 않겠다는 의미 이죠.

그 뒤에 [ ] 부분은 문자를 의미 합니다. "[" "]" 안에 들어 있는 문자를 찾는겁니다. 그런데 "^"이 꺽쇠 표시는 반대를 의미 합니다. \s 는 배우 셨죠?

자 정리 \s(공백)이 아닌 문자를 "+"가 있으니가 1개 이상의 문자를 찾는데 ?: 이부분이 있으니 그부분은 찾더래도 포함하지 않는다.

그런데 ( ) 뒤에 또 "?" 물음표가 있네요 이건 있거나 없거나 라는 뜻입니다.

1번을 눌렀을때

2번을 눌렀을때

[ ] 안의 글자를 바꾸어 보았습니다. 잘 적용 되죠?


그런데 이렇게 제목 부분 앞 뒷 부분만 정규식을 작성하면 오류가 발생할 확률이 높습니다. 소스중에는 분명 <span> ... </a> 로 끝나는 내용이 한두개가 아닐겁니다. 게시판 목록 글뿐만 아니라 <span> 으로만 시작하는 소스가 50개가 넘습니다.


자 다시한번 정리하겠습니다.


\s  공백

. 한개의 문자

+ 1개이상 있다.

( ) 그룹화(가져올 내용)

(?:) 이 그룹은 그룹되어 있으나 내용은 쓰지 않는다.

( )? 이 그룹이 있을수도 있고 없을 수도 있다.

[ ] 문자

^ 반대로

아래 부분은 이해하시라고 몇개 풀어 써 봅니다. 자주 쓰는 정규식 내용이라

[^<]

<가 아닌 글자 1개를 찾는다.

[^<+] 

글자열을 가지고 오는데 >가 나올때 까지 >가 아닌 글자를 찾는다.



작성자

Posted by 잡스러운 지곰군

태그

관련 글

댓글 영역