2010-07-10 4 views
2

url에서 html 콘텐츠를 가져 와서 html 콘텐츠를 정규 표현식으로 파싱하고 싶습니다. 그러나 HTML 콘텐츠에는 몇 바이트의 멀티 바이트 문자가 있습니다. 그래서 제목에 설명 된 오류를 만났습니다.UnicodeEncodeError : 'gbk'코덱이 문자를 인코딩 할 수 없습니다 : 불법 멀티 바이트 시퀀스

누군가이 문제를 해결하는 방법을 말해 줄 수 있습니까?

+0

Re. regex를 사용하여 HTML 컨텐트를 파싱하는 방법은 다음을 참조하십시오. http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+1

@Alan Moore, @ Vinay Sajip : 문제는 html이나 regex와는 아무런 관련이 없습니다. 이것은 간단한 유니 코드 인코딩 문제로 드러납니다. 이를 반영하기 위해 태그를 수정 중입니다. –

답변

8

(1) 사용 된 코드 (2) 전체 오류 및 추적 (3) 관련 URL (4) 시도하고있는 문자 유니 코드을 표시하려면 질문을 편집해야합니다. ~ 인 코드 gbk

당신은 어떻게 든 html 콘텐츠의 원시 바이트에서 유니 코드 문자를 얻은 것 같습니다. 어떻게? html 콘텐츠에 어떤 인코딩이 지정되어 있습니까?

그러면 유니 코드 문자를 파일에 쓰려고하고 유니 코드를 gbk로 끝내려고합니다. HTML 콘텐츠의 원시 바이트 GBK로 인코딩되지 않은 경우, 당신이 표현 될 수없는 유니 코드 문자를 가지고 매우 가능하다

>>> u'\uffff'.encode('gbk') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'gbk' codec can't encode character u'\uffff' in position 0: illegal multibyte sequence 
>>> 

:이 과정에서이 같은 오류 뭔가있어 in gbk. 이 경우 원본 인코딩을 사용하여 결과를 인코딩하거나 유니 코드 문자를 사용할 수있는 gb18030으로 인코딩 할 수 있습니다.

또 다른 가능성은 당신이 원시 바이트 또는 유니 코드를 어떻게 든 맹 글링했다는 것입니다. 나는 확실히 당신의 정규식 음모 등, GB2312, GBK 같은 일부 가변 길이 문자 인코딩에 유니 코드에하지 행해졌 희망

업데이트 : 당신의 코드가 여기

입니다 :

import sys, urllib.request 
url = "http://www.meilishuo.com" 
wp = urllib.request.urlopen(url) 
content = wp.read() 
str_content = content.decode('utf-8') 
fp = open("web.txt","w") 
fp.write(str_content) 
fp.close() 

에서 나는 추론 했어 :
(1) 파이썬 3.x를
(2) sys.defaultencoding을 실행 == "GBK"- 그렇지 않으면 오류를 가지고 않을 것 메시지 일부를 repo 더 일찍 rted.

내 sys.defaultencoding은 'gbk'가 아니므로 최근 3 줄을 gbk_content = str_content.encode('gbk')으로 바꿨고 수정 된 코드 조각을 Python 3.1.2에서 실행했습니다.

관찰 :

(1)의 웹 사이트는 UTF-8로 OK 디코딩 = 문자셋있다 UTF-8
(2) 에러 메시지가 UnicodeEncodeError: 'gbk' codec can't encode character '\u2764' in position 35070: illegal multibyte sequence

\u2664는 딩뱃 (HEAVY BLACK HEART)이다. 웹 사이트는 동적입니다. 다른 시도에서 첫 번째로 문제가되는 문자는 \ xa9 (COPYRIGHT SIGN)입니다.

그래서 웹 페이지에는 gbk로 매핑되지 않은 유니 코드 문자가 포함되어 있습니다.옵션

가 (1) 'GBK'로 인코딩 만 사용하는
(2) 'GBK'로 인코딩 옵션을 '대체'하지만 옵션을 '무시'를 사용
(3) 인코딩으로 인코딩 즉 모든 지원

있습니다 유니 코드 문자 (UTF-8, GB18030)하고있는 당신이 GBK에없는 모든 문자를 렌더링하는 디스플레이 메커니즘이

+2

@ user351637 : 질문을 편집하십시오; 그러한 정보를 주석에 넣지 마십시오. –

+0

감사합니다 John, 이미 해결됨 – Joseph

+0

@ user351637 : 감사합니다 upvote; 결의안은 무엇 이었습니까? –

0

는 시도

open(file, 'r', encoding='utf-8') 

대신

,381,
관련 문제