BeautifulSoup로 html 파싱하다보면 꼭 한번씩 UnicodeEncodeError 예외가 발생한다.
디씨 인사이드의 갤러리를 많이 긁어서 그런지
유독 디씨 인사이드를 긁다보면 많게 느껴진다.
최근에 파이썬 크롤링 포스팅도 하고 있고
이참에 무슨 문제인지 소스라도 까보자 싶어서
beautifulSoup 공식사이트에서 소스도 다운받고 레퍼런스 문서도 슬렁슬렁 살펴보는데
UnicodeEncodeError 예외에 대해서 자기네들 문제가 아니라 시스템의 문제라고 적힌 부분이 있는 것이 아닌가.
(beautifulSoup documentation 의 Miscellaneous part)
생각을 해보면 지금까지 소스 작성을 visual studio2015 환경에서 했었고
출력 결과는 cmd 창에서 확인했다.
cmd의 charset(문자셋)은 cp949다.
하지만 html 코드는 utf-8이다.
utf-8에서 cp949로 출력을 위해 charset으로 변환 중, cp949로 변환할 수 없는 문자에 대해서
UnicodeEncodeError 예외가 발생하는게 이해가 된다.
윈도우즈의 cmd창에서는 예외가 발생하는 파이썬 소스와 html 파일을
OSX(맥)의 터미널에서 똑같이 실행해보면 아무런 문제 없이 정삭동작한다.
천천히 확인해볼까나.
:utf-8로 인코딩해서 저장하였고 저장된 html 파일의 내용과 헥사값이다.
이 html 파일을 파이썬에서 읽어와 beautifulSoup로 파싱하고 text값을 읽어내면
cmd에선 얄짤없이 예외를 던진다.
:그리고 그 실행 결과.
하지만 똑같은 html 소스와 파이썬 코드로 실행해보면?!
정상 동작을 한다.
이 두 콘솔의 근본적인 차이는? => charset.
그래서 cmd의 charset을 utf-8로 바꾼다면?!
cmd의 charset을 바꾸는 명령어는 chcp 다.
인자로 전달되는 코드페이지로 charset을 변경하고
전달하는 인자가 없을때는 현재 활성화 되어있는 코드페이지를 출력한다.
utf-8의 코드페이지 번호는 65001이다.
cmd 창에서 chcp 65001 를 실행하자.
실행 결과이다.
폭이 좁지만 예외 발생없이 '김소혜 갤러리'가 제대로 출력되는 것을 확인할 수 있다.
정확하게 예외가 발생하는 케이스는 &ndsp 를 처리하면서인데
cp949에서는 그게 안되서 발생하는 듯하다.
결론은.. 콘솔의 charset에 따라서 cmd의 문자열 출력의 예외 발생 상황 실험.
'python > beautifulSoup' 카테고리의 다른 글
파이썬(python) - 품절 상품의 입고 여부를 확인 해보자(Nike-Uptempo) (4) | 2017.04.30 |
---|---|
파이썬(Python) - 게시물 페이지에서 이미지를 다운받아 저장하기. (19) | 2016.11.21 |
파이썬(Python) - 게시판(갤러리)에서 게시물 페이지로! (3) | 2016.10.04 |
파이썬(Python) - beautifulSoup 으로 html 파싱 (2). 그전에 크롬의 개발자 도구로 a태그 찾아보기. (7) | 2016.08.20 |
파이썬(Python) - beautifulSoup 으로 html 파싱 (17) | 2016.07.16 |