2013-11-25 1 views
16

UTF-8로 인코딩 된 웹 페이지를 가져 오는 Python 프로그램을 실행 중이며 BeautifulSoup을 사용하여 HTML에서 일부 텍스트를 추출합니다.BeautifulSoup를 사용하여 UTF-8로 인코딩 된 HTML을 유니 코드 문자열로 올바르게 구문 분석하는 방법은 무엇입니까?

그러나이 텍스트를 파일에 쓰거나 콘솔에 인쇄하면 예기치 않은 인코딩으로 기록됩니다.

샘플 프로그램 :

import urllib2 
from BeautifulSoup import BeautifulSoup 

# Fetch URL 
url = 'http://www.voxnow.de/' 
request = urllib2.Request(url) 
request.add_header('Accept-Encoding', 'utf-8') 

# Response has UTF-8 charset header, 
# and HTML body which is UTF-8 encoded 
response = urllib2.urlopen(request) 

# Parse with BeautifulSoup 
soup = BeautifulSoup(response) 

# Print title attribute of a <div> which uses umlauts (e.g. können) 
print repr(soup.find('div', id='navbutton_account')['title']) 

는 실행이 결과 제공 :

# u'Hier k\u0102\u015bnnen Sie sich kostenlos registrieren und/oder einloggen!' 

을하지만 파이썬 유니 코드 문자열이 \xf6로 단어 könnenö 렌더링 기대 :

# u'Hier k\xf6bnnen Sie sich kostenlos registrieren und/oder einloggen!' 

나는 '에서 Encoding '매개 변수를 BeautifulSoup에 연결하고 read()decode() 개체 인 response을 시도하지만 아무런 차이가 없거나 오류가 발생합니다.

 20 74 69 74 6c 65 3d 22 48 69 65 72 20 6b c3 b6 | title="Hier k..| 
     6e 6e 65 6e 20 53 69 65 20 73 69 63 68 20 6b 6f |nnen Sie sich ko| 
     73 74 65 6e 6c 6f 73 20 72 65 67 69 73 74 72 69 |stenlos registri| 

내 파이썬 능력의 한계를 넘어 해요 : 명령 curl www.voxnow.de | hexdump -C

, 나는 웹 페이지가 실제로 UTF-8로 인코딩 된 것을 볼 수 ö 문자 (즉, 그것은 0xc3 0xb6을 포함) , 그래서 나는 더 이상 이것을 디버깅하는 방법에 관해서는 손해를보고있다. 어떤 충고? utf-8 그 결과를 인코딩

+0

이상한 .. 같은 '\ u0102 \ u015b ''''''입니다 .. – aIKid

+2

이 질문과 중복되지 않습니까? http://stackoverflow.com/questions/7219361/python-and-beautifulsoup-encoding-issues?rq=1 – justhalf

+0

@justhalf 저는 그 질문을 보았지만 생각하지 않습니다. 나는 같은 결과를 얻었다고 생각한다. 하지만 다시 확인해 보겠습니다. –

답변

19

justhalf 위에서 지적한 것처럼, 여기 내 질문은 본질적으로 this question의 중복입니다.

HTML 콘텐츠 자체가 UTF-8로 인코딩되어보고되었으며, 대부분 하나 또는 두 개의 잘못된 UTF-8 문자는 예외였습니다.

이 분명히 인코딩이 사용되는 대해 BeautifulSoup로, 그리고 혼란 다음과 같이 BeautifulSoup로하는 내용을 전달할 때 UTF-8로 먼저 디코딩하려고 할 때 :

: 나는 오류를 얻을 것
soup = BeautifulSoup(response.read().decode('utf-8')) 

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 186812-186813: 
        invalid continuation byte 

출력을 자세히 보면 문자 Ü은이 아닌 올바르지 않은 바이트 시퀀스 0xe3 0x9c으로 잘못 인코딩되었습니다.. 구문 분석하는 동안 만 유효 데이터가 BeautifulSoup로 전달 될 수 있도록 현재 highest-rated answer 그 질문에로

은 잘못된 UTF-8 문자는 제거 할 수 있습니다 제안 :

soup = BeautifulSoup(response.read().decode('utf-8', 'ignore')) 
3

나를 위해 작동하는 것 같다 :

print (soup.find('div', id='navbutton_account')['title']).encode('utf-8') 

그것은 산출 :

Hier können Sie sich kostenlos registrieren und/oder einloggen! 
+0

흠 .. 나는 두 개의 기계 (파이썬 2.7.3)로 시도했다; 그 코드는'ö '문자를 얻는 두 바이트 대신 네 바이트를줍니다 :'c4 82 c5 9b' –

관련 문제