2014-04-24 64 views
1

從這個網站http://engine.data.cnzz.com/main.php?s=engine&uv=&st=2014-03-01&et=2014-03-31中國Unicode的問題?

<tr class="list03" onclick="showMen1(9);" style="cursor:pointer;"> 
<td id="e_9" class="qh_one">百度彙總</td> 

我颳了文本,並試圖獲得百度彙總

但是當我r.encoding = 'utf-8'結果是�ٶȻ���

,如果我不使用utf-8結果°Ù¶È»ã×Ü

+1

頁面使用GBK,而不是UTF-8。 –

+0

你怎麼弄出來的?請你給我看看。我在html中看到'utf-8'。 – jason

+2

@jason_cant_code:第6行是'頁面上唯一帶有「utf-8」的地方聲明編碼導入的JavaScript。 – geoffspear

回答

3

服務器不會告訴你任何有用的響應標題,但HTML頁面本身包含:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 

GB2312是可變寬度編碼,如UTF-8。但是頁面在於;它實際上使用GBK,這是GB2312的擴展。與gb2313失敗

>>> len(r.content.decode('gbk')) 
44535 
>>> u'百度彙總' in r.content.decode('gbk') 
True 

解碼:

你可以用GBK就好解碼

>>> r.content.decode('gb2312') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 26367-26368: illegal multibyte sequence 

但由於GBK是GB2313的超集,它應該永遠是安全使用前即使在後者被指定時也是如此。

如果使用requests,然後設置r.encodinggb2312作品,因爲r.text使用replace處理時解碼錯誤:

content = str(self.content, encoding, errors='replace') 

所以在使用GB2312被屏蔽只在GBK定義的那些碼點解碼錯誤。

請注意,BeautifulSoup可以自行完成解碼;它會找到meta頭:

>>> soup = BeautifulSoup(r.content) 
WARNING:root:Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER. 

警告是由GBK碼點引起的,而網頁聲稱使用GB2312被使用。

+0

甜。看起來像'r.encoding ='gb2312''工作。 – jason

+0

感謝您的解釋。好東西。 – jason