2015-09-26 89 views
0

我想爬(輕輕地)一個網站,並下載我抓取的每個HTML頁面。爲了實現這一點,我使用庫請求。我已經完成了抓取列表,並嘗試使用urllib.open抓取它們,但是沒有用戶代理,我收到一條錯誤消息。所以我選擇使用請求,但我不知道如何使用它。Python爬行器:下載HTML頁面

headers = { 
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' 
} 
page = requests.get('http://www.xf.com/ranking/get/?Amount=1&From=left&To=right', headers=headers) 
with open('pages/test.html', 'w') as outfile: 
    outfile.write(page.text) 

問題是,當腳本嘗試寫在我的文件中的迴應,我得到一些編碼錯誤:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 6673-6675: ordinal not in range(128) 

我們如何寫在一個文件,而無需那些編碼問題?

回答

2

在Python 2,文本文件不接受Unicode字符串。使用response.content訪問原始二進制,未解碼的內容:

with open('pages/test.html', 'w') as outfile: 
    outfile.write(page.content) 

這將寫入所下載的HTML原編碼由網站提供服務。

另外,如果你想重新編碼到一個特定編碼的所有響應,使用io.open()從而產生不接受Unicode的文件對象:

import io 

with io.open('pages/test.html', 'w', encoding='utf8') as outfile: 
    outfile.write(page.text) 

注信令在正確的編解碼器,很多網站需要HTML標籤,並且內容可以在沒有字符集參數的情況下被提供。

在這種情況下requests使用默認編解碼器的MIME類型text/*,拉丁-1,HTML解碼爲Unicode文本。 這通常是錯誤的編解碼器並依靠此行爲可以導致以後輸出Mojibake。我建議你堅持編寫二進制內容,並依靠像BeautifulSoup這樣的工具來稍後檢測正確的編碼。

可替代地,測試明確地爲charset參數存在,只有重新編碼(通過response.textio.open()或其他)如果requests不降回Latin-1的默認值。請參閱retrieve links from web page using python and BeautifulSoup獲取答案,我使用這種方法告訴BeautifulSoup使用哪種編解碼器。

0
outfile.write(page.text.encode('utf8', 'replace')) 

我發現的文件就在這裏:unicode problem

+1

UTF-8編碼解碼器可以編碼所有的Unicode標準,「替換」錯誤處理程序在這裏是多餘的,因爲它永遠不會被需要。 –