빅데이터/빅데이터 with python

[빅데이터 python] 웹 수집 로봇 만들기 - 2. EHHelper 클래스 정의

언제나휴일 2020. 11. 16. 11:43
반응형

안녕하세요. 언제나휴일입니다.

 

이전 게시글에서는 웹 수집 로봇에 필요한 테이블을 정의하였습니다.

2020/11/16 - [빅데이터/빅데이터 with python] - [빅데이터 python] 웹 수집 로봇 만들기 - 1. 테이블 정의

이번 게시글에서는 웹 수집 로봇 및 웹 검색 엔진 서비스 등에서 필요한 도우미 클래스(EHHelper)를 정의할게요.

1. 해야 할 일

문자열 내에 태그를 제거하기
문자열 내에 특수문자 제거하기
문자열 내에 HTML 특수문자 제거하기
MSSQL에 한글 문자열을 파이썬의 한글 문자열로 변환

2. EHHelper 클래스 정의하기

웹 페이지 혹은 Open API 등으로 웹 서비스를 통해 얻어온 결과를 그대로 사용하는 것이 불편할 때가 있습니다.

예를 들어 Open API를 이용하여 도서 검색을 요청하면 결과에 HTML에서 긁은 글씨를 의미하는 <b>와 같은 태그가 제목과 함께 있습니다. 도서 제목이 "<b>빅데이터</b> with <b>파이썬</b>"처럼 나타나는 것은 불편하겠죠.

 

그리고 웹 페이지 내용에 특수 문자들이 쿼리문자열의 내용을 엉망으로 만들어 버릴 수도 있습니다.

예를 들어, 수집한 웹 페이지 제목으로 사이트 주소를 검색하는 쿼리를 작성하는 코드가 있다고 가정할게요.

query = str.format("Select url from WepPage where title='{0}' ",wp.title) 

이 때 wp.title 내용이 "Python's Operation"이라면 중간에 단일 콤마(')때문에 쿼리가 다음처럼 엉망이 되어 버립니다.

"Select url from WebPage where title = 'Python's Operation' "

 

MSSQL 테이블에 있는 한글 데이터를 python에 읽어와서 화면에 표시하면 깨진 현상을 볼 수 있습니다. 이러한 부분도 EHHelper에서는 변환해 줍니다.

 

2.1 RemoveTag - 태그 제거

여기에서는 <로 시작해서 >로 끝나는 부분은 태그로 처리할게요. 이를 위해 문자열에서 해당 문자가 있는 위치를 찾는 것이 필요하겠죠.

    @staticmethod
    def FindTag(src):
        s = src.index('<')
        e = src.index('>')
        return s,e

태그를 제거하는 메서드는 입력 문자열에 여러 개의 태그를 포함할 때도 제거 가능하게 반복문을 사용합니다. FindTag를 호출한 결과에서 s보다 e가 클 때 "시작~s-1 구간"[:s]과 "e+1~마지막 구간"[e+1:]을 하나로 합치면 s~e 사이를 추출할 수 있습니다.

만약 그렇지 않을 때는 >이 앞쪽에 있는 것이므로 해당 부분만 제거합니다.

물론 발견하지 못할 때 이러한 작업을 하는 것은 예외를 발생하겠죠. 의도적으로 예외 처리 문을 이용하여 예외 발생하면 더 이상 태그가 없는 것이므로 현재까지 변환한 문자열을 반환합니다.

    #태그를 제거
    @staticmethod
    def RemoveTag(src):
        try:
            while True:
                s,e = EHHelper.FindTag(src)
                if s<e:
                    src = src[:s]+src[e+1:] #태그를 제거하는 구문
                else:#'>'가 '<'보다 앞에 있을 때
                    src = src[:e]+src[e+1:]#'>'만 제거하는 구문
        except:# 더 이상 태그가 없음
            return src

2.2 RemoveHtmlSpecialCh - HTML 특수 문자 제거하기

HTML 특수 문자들은 &quot; 처럼 &로 시작하고 ;로 끝납니다.

여기에서는 이러한 특징을 이용하여 태그를 제거하는 방법처럼 구현합시다.

    @staticmethod
    def RemoveHtmlSpecialCh(src):
        try:
            while True:
                s,e = EHHelper.FindHtmlSpecialCh(src)
                if s<e:
                    src = src[:s]+src[e+1:] #특수 문자를 제거
                else:
                    src = src[:e]+src[e+1:]#';'만 제거
        except:# 더 이상 특수 문자 없음
            return src
    @staticmethod
    def FindHtmlSpecialCh(src):
        s = src.index('&')
        e = src.index(';')
        return s,e

2.3 RemoveSymbol - 특수 문자를 제거

여기에서는 알파벳과 공백을 제외한 나머지 문자는 특수 문자로 취급하여 제거하고 공백으로 대체할게요.

    @staticmethod
    def RemoveSymbol(src):#심볼 제거=>공백으로 대체
        dest=""
        for elem in src:
            if str.isalpha(elem) or str.isspace(elem):
                dest += elem
            else:
                dest += " "
        return dest

2.4 MssqlstrToStrKor - MSSQL 한글을 python 한글로 변환

MSSQL과 파이썬을 연동할 때 한글 깨짐을 해결하는 방법은 여러가지가 있습니다. 이 중에 다음도 한 가지 해결 방법입니다.

    #mssql에 한글 문자열을 파이썬에 한글 문자열로 변환
    @staticmethod
    def MssqlstrToStrKor(src):
        try:
            src = src.encode('ISO-8859-1')
            src = src.decode('euc-kr')
        except:
            return ""
        else:
            return src

2.5 전체 코드

다음은 EHHelper 클래스 전체 소스 코드입니다.

#EHHelper.py
class EHHelper:
    #src:"<b>음냐뤼, quot; 가나다quot;</b>
    #RemoveTag
    #src:"음냐뤼, quot; 가나다quot;"
    #RemoveHtmlSpecialCh
    #src:"음냐뤼, 가나다"
    #RemoveSymbol
    #src:"음냐뤼 가나다"
    @staticmethod
    def EmitTagAndSpecialCh(str):
        str = EHHelper.RemoveTag(str)
        str = EHHelper.RemoveHtmlSpecialCh(str)
        str = EHHelper.RemoveSymbol(str)
        return str
    #태그를 제거
    @staticmethod
    def RemoveTag(src):
        try:
            while True:
                s,e = EHHelper.FindTag(src)
                if s<e:
                    src = src[:s]+src[e+1:] #태그를 제거하는 구문
                else:#'>'가 '<'보다 앞에 있을 때
                    src = src[:e]+src[e+1:]#'>'만 제거하는 구문
        except:# 더 이상 태그가 없음
            return src
    @staticmethod
    def FindTag(src):
        s = src.index('<')
        e = src.index('>')
        return s,e
    @staticmethod
    def RemoveSymbol(src):#심볼 제거=>공백으로 대체
        dest=""
        for elem in src:
            if str.isalpha(elem) or str.isspace(elem):
                dest += elem
            else:
                dest += " "
        return dest
    @staticmethod
    def RemoveHtmlSpecialCh(src):
        try:
            while True:
                s,e = EHHelper.FindHtmlSpecialCh(src)
                if s<e:
                    src = src[:s]+src[e+1:] #특수 문자를 제거
                else:
                    src = src[:e]+src[e+1:]#';'만 제거
        except:# 더 이상 특수 문자 없음
            return src
    @staticmethod
    def FindHtmlSpecialCh(src):
        s = src.index('&')
        e = src.index(';')
        return s,e
    #mssql에 한글 문자열을 파이썬에 한글 문자열로 변환
    @staticmethod
    def MssqlstrToStrKor(src):
        src = src.encode('ISO-8859-1')
        src = src.decode('euc-kr')
        return src
반응형