winpython是个坑_Python爬虫|Windows编码的一个暗坑

一个道歉:

很抱歉可能在最近一个月之内我们的专栏更新速度都会非常慢,等我们进度赶完了继续更新,恳请大家原谅。

--------我的学弟在学习@xlzd 的爬虫第三讲(http://xlzd.me/2015/12/16/python-crawler-03)的时候遇到了无法解决的编码问题,几天都没有解决。最后我试验了几次以后才找到原因。这篇专栏作为一个note记录一下这个问题。之后会有专门的专栏讲坑爹的Python的编码问题,特别是Windows下的暗坑。

一个补充:感谢@vczh 轮子哥提醒,这里漏写了一个步骤,在以下步骤之前,我们已经可以通过requests.get返回的Response对象(响应报文)的encoding属性得知,本HTML的编码为UTF-8,使用方法详见:https://zhuanlan.zhihu.com/p/21394571?refer=xmucpp的第二部分。另,在Python里面通用的检查编码的模块是charset(https://pypi.python.org/pypi/charset/1.0.1)。

原博客相关代码如下:

import codecs

def main():

url = DOWNLOAD_URL

with codecs.open('movies', 'wb', encoding='utf-8') as fp:

while url:

html = download_page(url)

movies, url = parse_html(html)

fp.write(u'{movies}\n'.format(movies='\n'.join(movies)))

如果换成print,就会报编码错误。很多初学者都容易被Windows下这个暗坑坑住。这里的主要原因是,Windows下对中文的编码默认是GBK。明白了这个坑,我们就可以对应设计解决方案了。处理方法有几种:

1. 对需要输出的内容编码。

如果直接输出:

print title

结果如下:

这里我们改为

print title.encode('gb18030')

这里我们使用gb18030的原因是,这个编码可以兼容所有gb系列的编码,可以有效地避免少部分GBK无法解码的内容。

结果如下:

可以看到确实不会报错了,但是还是有一些无法编码的内容。没有办法,这是GB系列的坑。

如果用UTF-8编码:

print title.encode('utf-8')

则会出现如下惨状:

2. 不使用cmd,用IDE的控制台输出。

不过这里需要注意一点,如果IDE默认的编码是GBK(比如我的Eclipse没有修改之前),那么会出现上面同样的情况。这里处理方式很简单,修改IDE的默认编码设置就OK了。比如Eclipse,Windows->Preferences->Workspace:

Text file encoding 修改成UTF-8就好了。修改之后文件写入的问题也顺便解决了。

PS:一开始以为是Windows下写入文件也会有同样的编码问题,在我重新设置了重装的Eclipse的Text file encoding之后就不会有问题了。cmd下直接运行无论哪种编码都是可以正常写入文件的,用Notepad++也可以正常读出文件内容。

----------

项目联系方式:项目邮箱(@iGuo 的邮箱):zhangguocpp@163.com

申请加入项目,请联系CHO@Suri :liuxiaomancpp@163.com

知乎:@iGuo(CEO)@Suri(COO&CHO,Human) @林行健@Dementia (CTO)@张土不 (CFO)@张一(CRO,Research)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值