반응형

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 파일을 읽어와 beautifulSoup로 파싱.


:그리고 그 실행 결과.


하지만 똑같은 html 소스와 파이썬 코드로 실행해보면?!


정상 동작을 한다.


이 두 콘솔의 근본적인 차이는? => charset.


그래서 cmd의 charset을 utf-8로 바꾼다면?!


cmd의 charset을 바꾸는 명령어는 chcp 다. 

인자로 전달되는 코드페이지로 charset을 변경하고 

전달하는 인자가 없을때는 현재 활성화 되어있는 코드페이지를 출력한다.


utf-8의 코드페이지 번호는 65001이다.

cmd 창에서 chcp 65001 를 실행하자.


실행 결과이다.




폭이 좁지만 예외 발생없이 '김소혜 갤러리'가 제대로 출력되는 것을 확인할 수 있다.


정확하게 예외가 발생하는 케이스는 &ndsp 를 처리하면서인데 

cp949에서는 그게 안되서 발생하는 듯하다.


결론은.. 콘솔의 charset에 따라서 cmd의 문자열 출력의 예외 발생 상황 실험.




반응형