안녕하세요. 언제나휴일입니다.
이전 게시글에서는 웹 수집 로봇에 필요한 테이블을 정의하였습니다.
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 특수 문자들은 " 처럼 &로 시작하고 ;로 끝납니다.
여기에서는 이러한 특징을 이용하여 태그를 제거하는 방법처럼 구현합시다.
@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
'빅데이터 > 빅데이터 with python' 카테고리의 다른 글
[빅데이터 python] 웹 수집 로봇 만들기 - 5. CandidateSql 클래스 정의 (0) | 2020.11.16 |
---|---|
[빅데이터 python] 웹 수집 로봇 만들기 - 4. WebPageSql 클래스 정의 (0) | 2020.11.16 |
[빅데이터 python] 웹 수집 로봇 만들기 - 3. WebPage 클래스 정의 (0) | 2020.11.16 |
[빅데이터 python] 웹 수집 로봇 만들기 - 1. 테이블 정의 (0) | 2020.11.16 |
[빅데이터 python] 웹 페이지 수집하기 (0) | 2020.11.16 |