2015-10-24 21 views
0

我創建了一個函數來讀取特定網址的HTML內容。這裏是代碼:Python有時返回奇怪的結果當從URL讀取HTML

def __retrieve_html(self, address): 
    html = urllib.request.urlopen(address).read() 
    Helper.log('HTML length', len(html)) 
    Helper.log('HTML content', html) 
    return str(html) 

但是,該函數並不總是返回正確的字符串。在某些情況下,它會返回一個非常奇怪的字符串。

例如,如果我使用的網址:http://www.merdeka.com,有時它會給出正確的HTML字符串,但有時也返回類似結果:

HTML content: b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\xfdyW\x1c\xb7\xd28\x8e\xffm\x9f\x93\xf7\xa0;y>\xc1\xbeA\xcc\xc2b\x03\x86\x1cl\xb0\x8d1\x86\x038yr\......Very long and much more characters. 

它似乎只在有任何的網頁發生很多內容。對於像Facebook.com登錄頁面和Google.com索引這樣的簡單頁面,它從未發生過。這是什麼?我的錯誤在哪裏以及如何處理?

回答

1

看起來http://www.merdeka.com的響應是gzipped壓縮。

試試這個:

import gzip 
import urllib.request 
def __retrieve_html(self, address): 
    with urllib.request.urlopen(address) as resp: 
     html = resp.read() 
     Helper.log('HTML length', len(html)) 
     Helper.log('HTML content', html) 
     if resp.info().get('Content-Encoding') == 'gzip': 
      html = gzip.decompress(html) 
     return html 

如何在html對象進行解碼,我離開作爲練習給你。

或者,你可以只使用請求模塊:

與安裝:

pip install requests 

然後執行類似:

import requests 
r = requests.get('http://www.merdeka.com') 
r.text 

請求並未有任何麻煩與從http://www.merdeka.com

+0

是的,它的工作原理。你是對的先生。謝謝! – yunhasnawa

1

您得到的是字節而不是字符串,因爲urrlib無法爲您解碼響應。這可能是因爲有些網站在其內容類型標題中省略了編碼聲明。

例如,google.com具有:

的Content-Type:text/html的;字符集= UTF-8

http://www.merdeka.com網站剛:

的Content-Type:text/html的

所以,你需要手動解碼的反應,例如用UTF-8編碼

html = urllib.request.urlopen(address).read().decode('utf-8') 

問題是你需要設置正確的編碼,如果它是不在服務器頭部,你需要以某種方式猜測它。

看到這個問題的更多信息How to handle response encoding from urllib.request.urlopen()

PS:考慮從有點過時urllibrequests LIB移動。它在這個時候更簡單,更時尚,更性感:)

+0

的迴應顯然它是t該問題歸因於gzip-ed文本。無論如何,謝謝你的建議,先生。 – yunhasnawa