import urllib.request
res = urllib.request.urlopen('http://www.tantengvip.com').read()
html = res.decode('utf8')
print(html)
但是报错
D:\learn-python>python zhua_tantengvip.py
Traceback (most recent call last):
File "zhua_tantengvip.py", line 5, in <module>
print(html)
UnicodeEncodeError: 'gbk' codec can't encode character '\xe6' in position 49945:
illegal multibyte sequence
我上网查了,编码问题,说了很多解决办法,都没用。我是python3环境,在windows的cmd运行的代码。
1
kingname 2015-05-11 11:24:22 +08:00
|
2
Septembers 2015-05-11 11:27:43 +08:00
resp = requests.get('http://www.tantengvip.com')
print(resp.text) |
3
tanteng OP @Septembers 最好是能用urllib.request
|
4
facat 2015-05-11 11:30:44 +08:00
html = res.decode('utf8',errors="ignore")
忽略错误。 |
6
tanteng OP |
7
jason52 2015-05-11 11:43:30 +08:00
cmd的问题吧,你用idle试试
|
8
tanteng OP @Septembers 我用print(resp.text)形式还是提示编码错误,用print(resp.content)可以打印内容,但是内容没有经过编码,汉字显示的是\xf23这样的
|
9
jason52 2015-05-11 11:44:00 +08:00
或者不要print出来,写到文件里面去
|
11
tanteng OP @jason52 Idle里打印确实ok了!但是处理这种抓取中文网站的东西,都要去Idle里跑吗,不习惯Idle,习惯了cmd命令行。。。或者有什么其他的编辑器推荐,写代码我用的是sublime
|
12
Sylv 2015-05-11 12:02:21 +08:00 via iPhone
因为你 cmd 用的编码是 gbk,所以 Python 在 print 时会将 unicode 编码成 gbk 的字符串。
问题就出在了这网页中有 "æ" 等字符是不在 gbk 编码范围内的,所以用 gbk 进行编码时就出错了。 解决办法: 1. 忽略编码错误,跳过这些字符:print(html.encode('gbk', errors='ignore')) 2. 改用 gb18030 编码,但我不知道 cmd 能不能正常显示:print(html.encode('gb18030')) 3. 改用 utf-8 编码的终端,或用 utf-8 编码写到文件去而不打印。 |
13
imn1 2015-05-11 12:50:03 +08:00
打开cmd,输入'chcp 65001'并回车,再运行你的utf-8程序
一劳永逸可以修改cmd的默认编码,自行google操作步骤,但这样有可能影响一些gbk的程序,自行斟酌 |
14
flight2006 2015-05-11 12:59:54 +08:00 via Android
中文网页也有用gbk编码的,你可以随便打开一个网页查看源码编码,如果是gbk的话用utf8也会报这个错。另外win下用python太蛋疼,不如搞个虚拟机
|
15
recall704 2015-05-11 13:36:35 +08:00
我也曾遇到这个问题,这个问题是由于请求返回的数据使用 gzip 进行了压缩,你可能需要解压.
参考:http://www.01happy.com/python-request-url-gbk-decode/ |
17
matrix67 2015-05-11 13:48:39 +08:00 via Android
别用win。。这是终极
|
19
tanteng OP |
20
Sylv 2015-05-11 15:53:43 +08:00 via iPhone
@tanteng
http://stackoverflow.com/questions/14114729/save-a-file-using-the-python-requests-library 没有现成的,自己分装下。或者同时用 urlretrieve 也未尝不可。 |