python2 爬虫怎么处理字符串编码?

2015-10-10 17:15:53 +08:00
 ZenZen


import urllib2
s = urllib2.urlopen('http://www.zhihu.com').read()
s.decode('utf-8','ignore')

输出在 windows cmd 和 ubuntu 下面都是乱码,如\u89c1 等等

3492 次点击
所在节点    Python
14 条回复
lixia625
2015-10-10 17:20:56 +08:00
使用 python3
233333...
Tink
2015-10-10 17:24:04 +08:00
这不是乱码,你在转一次啊
jessynt
2015-10-10 17:25:57 +08:00
#coding:utf-8
1.最前面加上这段
2.查看文件编码是不是 Utf-8
3.查看网页编码
另外:建议使用 Requests 来做爬虫,或者如楼上所说,使用 Python3
binux
2015-10-10 17:26:06 +08:00
你需要先去了解下什么是编码,编码不只在 decode 除发生,在输出时也会涉及编码
binux
2015-10-10 17:36:27 +08:00
1 、所有教你加 coding:utf-8 ,改文件编码的,都是取网上抄代码,不理解为什么的。这两个只影响源代码里面的中文如何解码的问题,源代码里不带或不使用源代码中的字符串,这个设定是没有用的。
2 、我们说,要三码合一,或者三码对应,就是,输入编码,程序(内存)内编码,输出编码;要分别与输入,程序,输出环境编码对应。
3 、最后,你这个根本不是乱码,只是你输出的不是文字的「字面意」而是字符串「表达式」(represent)
tonic
2015-10-10 17:38:21 +08:00
@binux 宽神好赞! 已经不止一次科普过...
rungo
2015-10-10 17:42:08 +08:00
print s.decode('utf-8','ignore')
glasslion
2015-10-10 17:59:01 +08:00
btw, windows cmd 下的乱码 可能更不不是 python 的问题, windows 没有一个代码页是支持 utf-8 的
n6DD1A640
2015-10-10 17:59:14 +08:00
+1024 用 python 3
Delbert
2015-10-11 08:27:57 +08:00
Windows cmd 的 code page 是 cp936 ,输出再 encode 为 gkb 就好,不清楚 Ubuntu 的 terminal 是啥编码
zog
2015-10-14 15:37:34 +08:00
import urllib2
s = urllib2.urlopen('http://www.zhihu.com').read()
print(s) ---->str
a = type(s.decode('utf-8','ignore')) -->unicode

print s
你看看那是不是乱码了?不是了吧。交互环境下调用的是__repr__()。尝试比较 print s.__repr__()和 s.__str__()。
zog
2015-10-14 15:41:46 +08:00
建议补充交互式环境下输出知识, repr 函数, str 函数,以及什么是 unicode ,什么是 utf8 。
a358003542
2015-10-15 22:14:19 +08:00
题主的意思主要是指终端显示那块,这个主要参考一下两个网页:

https://docs.python.org/3.4/howto/unicode.html

http://stackoverflow.com/questions/10569438/how-to-print-unicode-character-in-python

我因为对终端具体打印效果不太关心,了解这个问题,但从来没有实际解决过。楼主如果有兴趣,可以看到 wikipedia 这个项目, util 里面就有这个函数:

# from http://stackoverflow.com/questions/3627793/best-output-type-and-encoding-practices-for-repr-functions
def stdout_encode(u, default='UTF8'):
encoding = sys.stdout.encoding or default
if sys.version_info > (3, 0):
return u.encode(encoding).decode(encoding)
return u.encode(encoding)
a358003542
2015-10-15 22:15:50 +08:00
```python
def test():
pass
```

这网站还不支持代码显示?又不是什么难问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/226970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX