2012-01-29 9 views
0

urllib2를 사용하여 웹 페이지를 다운로드하고 MySQL 데이터베이스에 저장하려고합니다. 나는이 오류가 발생하지만python utf-8 HTML의 디코딩 오류

result_text = result.read() 
result_text = result_text.decode('utf-8') 

가 :

은 데이터 :이 같은 'UTF8'코덱 바이트 디코딩 할 수는 0x88의

이제

는 HTML 메타 태그는 상태 그 인코딩은 실제로 utf-8입니다. 필자는이 라인이 주위에 얻을 관리 : 나쁜 문자를 대체

result_text = result_text.decode('utf-8','replace') 

합니다. 그러나, 이것이 다운로드 된 데이터에 문제가 있다는 표시가 아니거나 소중한 문자를 제거하는 것이 아닙니다. IU는 페이지에 JavaScript도 포함되어 있다고 추가해야합니다.

왜 이런 일이 일어 났는지 말해 줄 수 있습니까? 감사

+1

페이지의 모든 문자가 utf-8로되어 있습니까? 헤더가 "거짓말"이 될 수는 있지만 – DonCallisto

+4

"utf8 '코덱은 바이트 0x88을 디코딩 할 수 없으므로 문제가되는 바이트의 위치도 알려야합니다. 위치가'n'이라면'decode ('utf-8') 호출 전에 print 문을 추가하고,'print (repr (result_text [n-20 : n + 결과는 여기에있다. – unutbu

+1

소스 데이터에 대한 링크를 게시하지 않았으므로 적절한 대답을 드릴 수는 없습니다. 그러나 원본 데이터의 인코딩은 잘못된 UTF-8 인코딩 일 가능성이 높으며 사용자가 취할 수있는 방법이 없습니다. –

답변

0
당신의 작은 데이터 샘플의

분석 :

>>> s = "\x98cW\x01\xa2\xbb\xba\xcc\xec\x90\xfc\xffP\xcb%\x01\x08" 
>>> u = s.decode('utf8', 'replace') 
>>> u 
u'\ufffdcW\x01\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd%\x01\x08' 
>>> u.count(u'\ufffd') 
9 
>>> len(u) 
16 

(1) 그것은 확실히 UTF-8 가끔 잘못된 시퀀스입니다; 유니 코드 문자의 50 % 이상이 유효하지 않습니다. 다른 말로하면 앞뒤를 누르고 data.decode('utf8', 'replace')을 사용하는 것은 좋지 않습니다 (이 TINY 샘플을 기반으로 함).

(2) \x01 (두 번) 및 \x08은 어떻게 든 이진 데이터를 가지고 있다고 의심하게 만듭니다.

(3) 의견에서 인용 한 (잘 렸습니다) 오류 메시지는 0x88을 언급했지만 예제 데이터에는 0x88이 없습니다.

(4) 처음에 수행 했어야 할 사항을 보여주기 위해 질문을 편집하십시오 : (a) 액세스하는 URL을 포함하여 문제를 재현하는 데 필요한 최소 코드 (b) 전체 오류 메시지 및 추적 (c) 메모리에서 타이핑하지 않고 (a) 및 (b)를 복사/붙여 넣었 음을 보증합니다.

+0

좋아요, 당신의 의견을 말하게하겠습니다 : 1. 사실이면서도 유일한 잘못된 시퀀스는 작고 중요하지 않은이 "url :"부분에 있습니다. 2. 코드에서 'result = proxy ['opener ']. open (request) result_text = result.read() \t \t \t result_text.decode ('utf-8 ') URL을 공개 할 수 없습니다.다른 실행에서 나는 다른 잘못된 순서를 가졌다. 4. 나는 확신을 가지고있다. 나는 복사/psated했다. – WeaselFox