2017-05-03 61 views
1

我使用Python Scrapy抓取this link。所有的文件都有# -*- coding: utf-8 -*-在開始Python Scrapy不返回中文字符

並提取產品的標題,我有這個代碼。

response.css("h1.d-title::text").extract_first()

這說明

2017\xe6\x98\xa5\xe5\xa4\x8f\xe6\x96\xb0\xe6\xac\xbe\xe5\xa5\xb3\xe5\xa3\xab\xe8\xbf\x90\xe5\x8a\xa8\xe9\x9e\x8b\xe9\x9f\xa9\xe7\x89\x88\xe4\xbc\x91\xe9\x97\xb2\xe7\xbd\x91\xe5\x8d\x95\xe9\x9e\x8bsport shoes men\xe5\xa4\x96\xe8\xb4\xb8\xe6\x89\xb9\xe5\x8f\x91 

如果我去做

response.css("h1.d-title::text").extract_first().decode('gbk').encode('utf-8')

它給我的錯誤

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

我在網上嘗試了其他的替代方法,但都沒有成功。

雖然如果我在Python終端(無Scrapy)中這樣做,它完全打印中文!

>>> s = "2017\xe6\x98\xa5\xe5\xa4\x8f\xe6\x96\xb0\xe6\xac\xbe\xe5\xa5\xb3\xe5\xa3\xab\xe8\xbf\x90\xe5\x8a\xa8\xe9\x9e\x8b\xe9\x9f\xa9\xe7\x89\x88\xe4\xbc\x91\xe9\x97\xb2\xe7\xbd\x91\xe5\x8d\x95\xe9\x9e\x8bsport shoes men\xe5\xa4\x96\xe8\xb4\xb8\xe6\x89\xb9\xe5\x8f\x91" 
>>> print s 
2017春夏新款女士運動鞋韓版休閒網單鞋sport shoes men外貿批發 

爲什麼它給出正確的輸出print

回答

0

根據與print s您的示例代碼,我假設你正在使用Python 2.7

當我給你列出的網站我得到了這個結果上運行

response.css("h1.d-title::text").extract_first() 

u'2017\u6625\u590f\u65b0\u6b3e\u5973\u58eb\u8fd0\u52a8\u978b\u97e9\u7248\u4f11\u95f2\u7f51\u5355\u978bsport shoes men\u5916\u8d38\u6279\u53d1' 

意味着scrapy已經將結果轉換爲一個unicode對象(這正是我所期望的)。

然後在其上運行decode('gbk')將因爲解碼嘗試將其解釋爲gbk編碼的字符串而失敗。

所以,如果你需要將其轉換爲UTF-8(而不是僅僅使用Unicode對象,我寧願),你應該這樣做:

response.css("h1.d-title::text").extract_first().encode('utf-8') 

結果:

'2017\xe6\x98\xa5\xe5\xa4\x8f\xe6\x96\xb0\xe6\xac\xbe\xe5\xa5\xb3\xe5\xa3\xab\xe8\xbf\x90\xe5\x8a\xa8\xe9\x9e\x8b\xe9\x9f\xa9\xe7\x89\x88\xe4\xbc\x91\xe9\x97\xb2\xe7\xbd\x91\xe5\x8d\x95\xe9\x9e\x8bsport shoes men\xe5\xa4\x96\xe8\xb4\xb8\xe6\x89\xb9\xe5\x8f\x91' 

它打印您期望的相同的字符串。

除此之外,使用Python3通常是一個好主意,因爲它可以處理大多數開箱即用的情況。

1

Scrapy Selector將返回一個unicode字符串列表,請參閱Using selectors with regular expressions。你需要做的是將unicode編碼爲UTF-8,不需要解碼爲gbk,然後編碼回utf-8。

title = response.css("h1.d-title::text").extract_first().encode('utf-8') 

對於蟒蛇終端打印,我覺得你的環境的默認編碼爲UTF-8,你可以輸入你的Python終端:

>>> import sys 
>>> print sys.stdout.encoding 
UTF-8 

在打印unicode字符串,它會轉換到UTF-8然後打印出來。