Python爬虫|Windows编码的一个暗坑

wgh 8年前
   <p>一个道歉:</p>    <p>很抱歉可能在最近一个月之内我们的专栏更新速度都会非常慢,等我们进度赶完了继续更新,恳请大家原谅。</p>    <p>--------</p>    <p>我的学弟在学习@xlzd 的爬虫第三讲( <a href="/misc/goto?guid=4959677034977238614" rel="nofollow,noindex"> http:// xlzd.me/2015/12/21/pyth on-crawler-06 </a></p>    <p>)的时候遇到了无法解决的编码问题,几天都没有解决。最后我试验了几次以后才找到原因。这篇专栏作为一个note记录一下这个问题。之后会有专门的专栏讲坑爹的Python的编码问题,特别是Windows下的暗坑。</p>    <p>原博客相关代码如下:</p>    <pre>  <code class="language-python">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)))</code></pre>    <p>如果换成print,就会报编码错误。很多初学者都容易被Windows下这个暗坑坑住。这里的主要原因是,Windows下对中文的编码默认是GBK。明白了这个坑,我们就可以对应设计解决方案了。处理方法有几种:</p>    <p>1. 对需要输出的内容编码。</p>    <p>如果直接输出:</p>    <pre>  <code class="language-python">print title</code></pre>    <p>结果如下:</p>    <p><img src="https://simg.open-open.com/show/66aca8aa901d51e5e45a014ac88704e5.png"></p>    <p>这里我们改为</p>    <pre>  <code class="language-python">print title.encode('gb18030')</code></pre>    <p>这里我们使用gb18030的原因是,这个编码可以兼容所有gb系列的编码,可以有效地避免少部分GBK无法解码的内容。</p>    <p>结果如下:</p>    <p><img src="https://simg.open-open.com/show/b8c569e45c6abe4593b252224d55c95a.png"> 可以看到确实不会报错了,但是还是有一些无法编码的内容。没有办法,这是GB系列的坑。</p>    <p>如果用UTF-8编码:</p>    <pre>  <code class="language-python">print title.encode('utf-8')</code></pre>    <p>则会出现如下惨状:</p>    <p><img src="https://simg.open-open.com/show/da90c4bbd3cef52e57fe4c18e486dcae.png"> 2. 不使用cmd,用IDE的控制台输出。</p>    <p>不过这里需要注意一点,如果IDE默认的编码是GBK(比如我的Eclipse没有修改之前),那么会出现上面同样的情况。这里处理方式很简单,修改IDE的默认编码设置就OK了。比如Eclipse,Windows->Preferences->Workspace:</p>    <p><img src="https://simg.open-open.com/show/c28dc94db23851fd9dcb3e4cf5d404de.png"> Text file encoding 修改成UTF-8就好了。修改之后文件写入的问题也顺便解决了。</p>    <p>PS:一开始以为是Windows下写入文件也会有同样的编码问题,在我重新设置了重装的Eclipse的Text file encoding之后就不会有问题了。cmd下直接运行无论哪种编码都是可以正常写入文件的,用Notepad++也可以正常读出文件内容。</p>    <p>----------</p>    <p>更多项目介绍,请关注我们的项目专栏: <a href="/misc/goto?guid=4959676854191570185" rel="nofollow,noindex">China's Prices Project - 知乎专栏</a></p>    <p>项目联系方式:</p>    <ul>     <li>项目邮箱(@iGuo 的邮箱):zhangguocpp@163.com</li>     <li>申请加入项目,请联系CHO@Suri :liuxiaomancpp@163.com</li>     <li>知乎:@iGuo(CEO)@Suri(COO&CHO,Human)@林行健@Dementia (CTO)@张土不 (CFO)@张一(CRO,Research)</li>    </ul>    <p> </p>    <p>来自:https://zhuanlan.zhihu.com/p/22094199</p>    <p> </p>    <p><span style="background:rgb(189, 8, 28) url("data:image/svg+xml; border-radius:2px; border:medium none; color:rgb(255, 255, 255); cursor:pointer; display:none; font:bold 11px/20px "Helvetica Neue",Helvetica,sans-serif; opacity:1; padding:0px 4px 0px 0px; position:absolute; text-align:center; text-indent:20px; width:auto; z-index:8675309">Save</span></p>