2012-12-11 2 views
3

에 detwingle 충돌 나는 웹 사이트를 스크랩하고 구문 분석 BeautifulSoup4를 사용합니다. websits이 정말 무작위 문자 세트를 가질 수 있듯이, 내가 BeautifulSoup로에 적절한 데이터를 공급하도록 UnicodeDammit.detwingle를 사용합니다. 추락 할 때까지 잘 작동했습니다. 한 웹 사이트에서 코드가 손상됩니다. "수프"를 구축하는 코드는 다음과 같습니다UnicodeDammit : 웹 사이트

u = bs.UnicodeDammit.detwingle(html_blob) <--- here it crashes 
u = bs.UnicodeDammit(u.decode('utf-8'), 
         smart_quotes_to='html', 
         is_html = True) 
u = u.unicode_markup 
soup = bs.BeautifulSoup(u) 

그리고 오류 (표준 파이썬 유니 코드 지옥 듀오)

File ".../something.py", line 92, in load_bs_from_html_blob 
    u = bs.UnicodeDammit.detwingle(html_blob) 
    File ".../beautifulsoup4-4.1.3-py2.7.egg/bs4/dammit.py", line 802, in detwingle 
    return b''.join(byte_chunks) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: 
ordinal not in range(128) 

기분을 상하게하는 웹 사이트가 this one

질문 : 방법 적절하고 방탄 웹 사이트 소스 디코딩을 만드는 방법?

+0

, 나는 함께 덤프 파일을 여는 권하고 싶습니다'' 'wb''' 대신''의' 'w ''를 사용하고''fh.write (html_blob)' '만 사용하면됩니다. 희망이 도움이됩니다. (즉, 이진 파일이 아닌 텍스트로를 열 수 있습니다, 그래서 파이썬은 바이너리 만약 당신이 쓰고있어 출력 다시 인코딩을 시도하지 않습니다) –

+0

@JonasWielicki을 : 감사합니다, 나는 완전히 그 시점을 놓쳤다. 질문을 편집하고이 문제를 제거했습니다. –

답변

4

이 웹 사이트는 올바르게 설정도 HTTP 헤더와 완벽하게 유효한 UTF-8입니다, 모든 문자 인코딩의 측면에서 특별한 경우가 아니다. 그런 다음 코드가 ASCII 이상의 코드 포인트로 utf-8로 인코딩 된 모든 웹 사이트에서 충돌했을 것입니다.

UnicodeDammit.detwingle이 유니 코드 문자열을 사용한다는 것도 설명서에서 분명합니다. 당신은 그것을 html_blob으로 넘겨 주며, 변수 네이밍은 그것이 해독 된 유니 코드 문자열이 아니라고 제안합니다. (오해)

http 헤더 나 마크 업이 인코딩에 포함되거나 전혀 포함되지 않은 경우 모든 웹 사이트 인코딩을 처리하는 것은 간단하지 않습니다. 당신은 다양한 경험적 방법을 수행 할 필요가있다. 그러나이 웹 사이트는 문자 집합 헤더를 올바르게 보내고 그 문자 집합에서 올바르게 인코딩되었습니다.


재미있는 퀴즈. 당신이 다음 GB2312 같은 결과를 ISO-8859-1 사람들을 인코딩 및 디코딩하는 경우

image = new Array(4); //¶¨ÒåimageΪͼƬÊýÁ¿µÄÊý×é 
image[0] = 'sample_BG_image01.png' //±³¾°Í¼ÏóµÄ·¾¶ 

, 당신이 얻을 : 웹 사이트에있는 유일한 ASCII 이상으로 텍스트 (UTF-8로 디코딩 후)이 자바 스크립트 주석입니다 :

구글 중국어가
image = new Array(4); //定义image为图片数量的数组 
image[0] = 'sample_BG_image01.png' //背景图象的路径 

-> 영어로 번역 : 디버깅

image = new Array(4); //Defined image of the array of the number of images 
image[0] = 'sample_BG_image01.png' //The path of the background image 
+0

의견을 주셔서 감사합니다. 충돌없이 페이지를 올바르게 디코딩하는 방법에 대한 작업 방법이 있습니까? 'dewingle'+'utf8'이 대부분의 경우 저에게 효과적이었습니다. 이제는 생각보다 방탄하지 않습니다. –

+0

흠, 적어도 HTML 스펙을 따를 때 디코딩 오류가 발생하지 않습니다. Content-Type 헤더를 읽은 다음 Content-Type 헤더가없는 경우 일치하는 태그를 찾습니다. 도움이되지 않는다면 utf8을 시도한 다음 latin1을 시도해보십시오 ([this function] (https://github.com/horazont/xmpp-crowd/blob/master/foomodules/URLLookup.py#L46)과 [그 기능] (https://github.com/horazont/xmpp-crowd/blob/master/foomodules/URLLookup.py#L227), 정확히 그렇게합니다.) –