我正在使用Python Scrapy抓取this link。所有文件的开头都有Warning: mysqli_real_escape_string() expects parameter 2 to be string, array given in D:\OpenServer\OpenServer\domains\localhost\SuiteCRM-7.8.2\include\database\MysqliManager.php on line 260
为了提取产品的标题,我有这个代码。
# -*- coding: utf-8 -*-
显示
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')
我在网上尝试了其他替代方案,但没有一个有效。
虽然如果我在Python终端(没有Scrapy)中这样做,它可以完美地打印中文!。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-19: ordinal not in range(128)
为什么用>>> 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外贸批发
给出正确的输出?
答案 0 :(得分: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')
对于在python终端中打印,我认为你的环境的默认编码是UTF-8,你可以输入你的python终端:
>>> import sys
>>> print sys.stdout.encoding
UTF-8
当您打印unicode字符串时,它将转换为utf-8然后打印出来。
答案 1 :(得分: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通常是一个好主意,因为它可以开箱即用地处理大多数此类情况。