BeautifulSoup으로 웹페이지를 긁어서 이것저것 하다보면, 한글 인코딩(euc-kr) 때문에 문제가 생기는 경우가 가끔 생깁니다. 이럴 때 어떻게 해야 할지 잘 몰랐는데, 여기저기 뒤지다가 방법을 발견해서 공유합니다.
우선 원인은 웹페이지안에 euc-kr 인코딩에 포함되지 않은 글자를 사용해서 생기는 문제입니다. 이런 경우 cp949로 디코딩을 하면 됩니다. 아래는 코드 입니다.
파라미터로 넘어온 s가 한글을 정상적으로 디코딩한 유니코드(BeautifulSoup은 모든 문자가 기본적으로 유니코드) 일 경우 encode('latin-1')에서 UnicodeEncodeError 예외가 발생하여 그냥 s를 리턴하고, 정상적이지 않은 경우에는 latin-1으로 인코딩한 후 cp949로 디코딩하여 제대로된 유니코드를 만들어 내는 코드입니다.
저같은 경우는 케챱이라는 단어가 들어간 페이지를 긁을 때 한글이 제대로 디코딩 되지 않았습니다. 챱이라는 글자가 euc-kr에 속하지 않은 글자였습니다.
아래 소스를 참고하였습니다.
http://openlook.org/svnpublic/snippets/kaistfood/kaistfood.py
* 수정: 2008-09-29 15:14
설명이 조금 미흡한 듯 하여 수정을 살짝 했습니다.
우선 원인은 웹페이지안에 euc-kr 인코딩에 포함되지 않은 글자를 사용해서 생기는 문제입니다. 이런 경우 cp949로 디코딩을 하면 됩니다. 아래는 코드 입니다.
def safeunicode(s):
try:
return s.encode('latin-1').decode('cp949')
except UnicodeEncodeError:
return s
파라미터로 넘어온 s가 한글을 정상적으로 디코딩한 유니코드(BeautifulSoup은 모든 문자가 기본적으로 유니코드) 일 경우 encode('latin-1')에서 UnicodeEncodeError 예외가 발생하여 그냥 s를 리턴하고, 정상적이지 않은 경우에는 latin-1으로 인코딩한 후 cp949로 디코딩하여 제대로된 유니코드를 만들어 내는 코드입니다.
저같은 경우는 케챱이라는 단어가 들어간 페이지를 긁을 때 한글이 제대로 디코딩 되지 않았습니다. 챱이라는 글자가 euc-kr에 속하지 않은 글자였습니다.
아래 소스를 참고하였습니다.
http://openlook.org/svnpublic/snippets/kaistfood/kaistfood.py

* 수정: 2008-09-29 15:14
설명이 조금 미흡한 듯 하여 수정을 살짝 했습니다.



댓글을 달아 주세요