Python urllib.request 抓取编码问题

2015-05-11 11:21:01 +08:00
 tanteng

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运行的代码。

7598 次点击
所在节点    Python
20 条回复
kingname
2015-05-11 11:24:22 +08:00
Septembers
2015-05-11 11:27:43 +08:00
resp = requests.get('http://www.tantengvip.com')
print(resp.text)
tanteng
2015-05-11 11:28:32 +08:00
@Septembers 最好是能用urllib.request
facat
2015-05-11 11:30:44 +08:00
html = res.decode('utf8',errors="ignore")
忽略错误。
wibile
2015-05-11 11:31:44 +08:00
@tanteng 不用requests是一生的遗憾啊~~~
tanteng
2015-05-11 11:37:50 +08:00
@wibile 我安装了requests模块,还是提示编码错误!
@Septembers
jason52
2015-05-11 11:43:30 +08:00
cmd的问题吧,你用idle试试
tanteng
2015-05-11 11:43:53 +08:00
@Septembers 我用print(resp.text)形式还是提示编码错误,用print(resp.content)可以打印内容,但是内容没有经过编码,汉字显示的是\xf23这样的
jason52
2015-05-11 11:44:00 +08:00
或者不要print出来,写到文件里面去
zankard
2015-05-11 11:49:29 +08:00
你不要输出到cmd就没问题的,redirect到文件应该不会出错
python test.py > tmp.txt
tanteng
2015-05-11 11:49:33 +08:00
@jason52 Idle里打印确实ok了!但是处理这种抓取中文网站的东西,都要去Idle里跑吗,不习惯Idle,习惯了cmd命令行。。。或者有什么其他的编辑器推荐,写代码我用的是sublime
Sylv
2015-05-11 12:02:21 +08:00
因为你 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 编码写到文件去而不打印。
imn1
2015-05-11 12:50:03 +08:00
打开cmd,输入'chcp 65001'并回车,再运行你的utf-8程序
一劳永逸可以修改cmd的默认编码,自行google操作步骤,但这样有可能影响一些gbk的程序,自行斟酌
flight2006
2015-05-11 12:59:54 +08:00
中文网页也有用gbk编码的,你可以随便打开一个网页查看源码编码,如果是gbk的话用utf8也会报这个错。另外win下用python太蛋疼,不如搞个虚拟机
recall704
2015-05-11 13:36:35 +08:00
我也曾遇到这个问题,这个问题是由于请求返回的数据使用 gzip 进行了压缩,你可能需要解压.

参考:http://www.01happy.com/python-request-url-gbk-decode/
matrix67
2015-05-11 13:47:00 +08:00
@jason52 胖胖。。。
matrix67
2015-05-11 13:48:39 +08:00
别用win。。这是终极
tanteng
2015-05-11 13:49:32 +08:00
@matrix67 在公司用windows,回家用mac,哈哈,现在处于学习Python入门阶段
tanteng
2015-05-11 14:22:39 +08:00
@wibile urllib.request有个urllib.request.urlretrieve(url, file_name)方法可以保存远程文件到本地,requests包有类似方法吗?
@Sylv
Sylv
2015-05-11 15:53:43 +08:00
@tanteng
http://stackoverflow.com/questions/14114729/save-a-file-using-the-python-requests-library
没有现成的,自己分装下。或者同时用 urlretrieve 也未尝不可。

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

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

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

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

© 2021 V2EX