코드공부방

[웹크롤링] 웹사이트 인코딩 확인 및 디코딩하기 (python) 본문

웹프로그래머/웹스크래핑

[웹크롤링] 웹사이트 인코딩 확인 및 디코딩하기 (python)

:- ) 2021. 9. 13. 13:06
반응형

[웹크롤링, 웹스크래핑]
웹사이트 인코딩 확인 및 디코딩하기 (python)


파이썬 urllib을 사용해 스크래핑을 할때, HTTP헤더와 HTML의 meta 태그를 기반으로 웹페이지 인코딩 방식을 판별해야 한다. 인코딩 방식을 제대로 판별하지 않으면 문자가 깨져보여 정확한 데이터를 추출할 수 없다.

먼저 urllib.request 모듈을 사용하여 네이버 웹페이지 소스를 추출해보자.

from urllib.request import urlopen
f = urlopen('https://naver.com')
f.read()

위 코드를 실행하면 아래와 같은 결과값을 얻을 수 있다.

네이버 메인페이지 소스코드

한글이 모두 깨져서 출력이 된다. HTTPResponse.read() 메소드로 추출한 값은 bytes 자료형이므로 원하는 정보를 얻으려면 문자열로 디코딩해야 한다. 최근에는 HTML5의 기본 인코딩 방식인 UTF-8로 작성된 웹페이지가 많아 UTF-8로 지정하는 것도 좋지만, 혹시 모를 상황에 대비해야 하니 HTTP 헤더를 분석하여 적절한 인코딩 방식으로 디코딩 하는 것이 좋다.


 

HTTP 응답의 Content-Type 헤더를 참조하면 해당 페이지에 사용되고 있는 인코딩 방식을 알아낼 수 있는데, 보통 'text/html', 'text/html; charset=UTF-8', 'text/html; charset=EUC-KR' 과 같은 헤더를 갖고 있다. 'charset'뒤에 적혀 있는 'UTF-8', 'EUC-KR'이 해당 페이지에 사용된 인코딩 방식이다. 이 값을 추출하기 위해 정규식을 사용해도 되지만 get_content_charset() 메소드를 사용하면 더욱 간단하게 인코딩 방식을 얻어올 수 있다.

from urllib.request import urlopen
f = urlopen('https://naver.com')

# 인코딩 방식 추출(명시되어 있지 않으면 utf-8을 사용한다.)
encoding = f.info().get_content_charset(failobj='utf-8')

# 추출한 인코딩 방식으로 디코딩
text = f.read().decode(encoding)

# 출력
print(text)

utf-8로 디코딩된 문자열이 출력되어 한글이 정상적으로 출력된다.

 


 

(Javascript, Python) 문장에서 HTML 코드, 태그 제거

문장에서 HTML 코드 제거 (javascript, python) 웹크롤링을 하거나 또는 가공된 데이터를 가져다 쓰다보면 데이터 내에 HTML코드가 삽입되어 있어 이를 제거하고 싶은 경우가 생길 수 있다. 이때 아

code-study.tistory.com

 

Python 텍스트(*.txt) 파일 읽고 출력(print)하기

텍스트(*.txt) 파일 불러와(import) 출력(print)하기 python에서 text파일 읽어와 print 테스트를 하기 위해 샘플 text파일을 생성했다. (파이썬 파일과 동일경로에 생성) 1. 출력하기 방법1 > 내장함수 사

code-study.tistory.com

 

중간 보고 : 패스트캠퍼스 - 파이썬(Python) 웹개발 올인원 패키지 잘 하고 있니?

정말 오랜만에 블로그에 글을 남긴다. 년 초반에는 거의 1일 1포스팅을 할 정도로 열정이 넘쳤었는데, 조금씩 바쁘다는 핑계로 멀리하다가 이제는 아예 관리를 안하는 수준까지 왔다. (블로그의

code-study.tistory.com

 

 

 

반응형
Comments