鱼C论坛

 找回密码
 立即注册
查看: 2411|回复: 8

好几次了,用requests.get打开网页报错,不知道如何忽律错误或者进一步操作。

[复制链接]
发表于 2019-1-8 02:45:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import requests
  2. res = requests.get('https://www.qiushibaike.com/text/page/1/')
  3. res.encoding = 'utf-8'
  4. print(res.text)
复制代码



错误的情况:
Traceback (most recent call last):
  File "C:/Users/sidian/OneDrive/python/new1.py", line 4, in <module>
    print(res.text)
UnicodeEncodeError: 'gbk' codec can't encode character '\u200b' in position 18642: illegal multibyte sequence

Process finished with exit code 1

大神指导下吧,感觉很多小网站可能解码有问题,但我不知道该如何操作了。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-8 02:49:05 | 显示全部楼层
把page/1换成2就好了,说明就第一页哪里有问题,我想忽律这个问题,还是能够读取出网页,我该如何操作,用了
  1. print(res.content.decode(encoding='utf-8',errors='ignore'))
复制代码
转码忽略错误还是不行,真的崩溃了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-8 09:36:21 | 显示全部楼层
  1. import requests
  2. headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  3. res = requests.get('https://www.qiushibaike.com/text/page/1/',headers=headers)

  4. import sys
  5. non_bmp_map = dict.fromkeys(range(0x10000, sys.maxunicode + 1), 0xfffd)
  6. name=res.text.translate(non_bmp_map)
  7. print(name)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-8 15:00:04 | 显示全部楼层

刚刚试了,还是不行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-8 15:06:50 | 显示全部楼层
四点好 发表于 2019-1-8 15:00
刚刚试了,还是不行。

但是我试可以
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-8 15:34:46 | 显示全部楼层

从网上抓了一些字节流,想打印出来结果发生了一下错误:
UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 8530: illegal multibyte sequence
代码
import urllib.request
res=urllib.request.urlopen('http://www.baidu.com')
htmlBytes=res.read()
print(htmlBytes.decode('utf-8'))
错误信息让人很困惑,为什么用的是'utf-8'解码,错误信息却提示'gbk'错误呢?

不仅如此,从百度首页的html中发现以下代码:
<meta http-equiv="content-type" content="text/html;charset=utf-8">
这说明网页的确用的是utf-8,为什么会出现Error呢?

在python3里,有几点关于编码的常识
1.字符就是unicode字符,字符串就是unicode字符数组
如果用以下代码测试,
print('a'=='\u0061')
会发现结果为True,足以说明两者的等价关系。

2.str转bytes叫encode,bytes转str叫decode,如上面的代码就是将抓到的字节流给decode成unicode数组
我根据上面的错误信息分析了字节流中出现\xbb的地方,发现有个\xc2\xbb的特殊字符&raquo;,我怀疑是它无法被解码。
用以下代码测试后
print(b'\xc2\xbb'.decode('utf-8'))
它果然报错了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

上网找了下utf-8编码表,发现的确特殊字符&raquo;的utf-8形式就是c2bb,unicode是'\u00bb',为什么无法解码呢。。。
仔细看看错误信息,它提示'gbk'无法encode,但是我的代码是utf-8无法decode,压根牛头不对马嘴,终于让我怀疑是print函数出错了。。于是立即有了以下的测试
print('\u00bb')
结果报错了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

原来是print()函数自身有限制,不能完全打印所有的unicode字符。
知道原因后,google了一下解决方法,其实print()函数的局限就是Python默认编码的局限,因为系统是win7的,python的默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了

import io
import sys
import urllib.request
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码
res=urllib.request.urlopen('http://www.baidu.com')
htmlBytes=res.read()
print(htmlBytes.decode('utf-8'))

运行后不报错了,但是居然有好多乱码(英文显示正常,中文则显示乱码)!!又一阵折腾后发现是控制台的问题,具体来说就是我在cmd下运行该脚本会有乱码,而在IDLE下运行却很正常。
由此我推测是cmd不能很好地兼容utf8,而IDLE就可以,甚至在IDLE下运行,连“改变标准输出的默认编码”都不用,因为它默认就是utf8。如果一定要在cmd下运行,那就改一下编码,比如我换成“gb18030”,就能正常显示了:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码
最后,附上一些常用的和中文有关的编码的名称,分别赋值给encoding,就可以看到不同的效果了:



编码名称
用途
utf8
所有语言
gbk
简体中文
gb2312
简体中文
gb18030
简体中文
big5
繁体中文
big5hkscs
繁体中文
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-8 15:35:53 | 显示全部楼层

https://www.cnblogs.com/feng18/p/5646925.html,这个是我百度的答案,你看下他分析的对吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-8 23:58:45 | 显示全部楼层
楼主你看下我这个测试的。

#!/usr/bin/env python3

import requests
url = 'http://www.baidu.com'
response = requests.get(url)
response.encoding = 'utf8'
print(response.text)


########################

\我的坚果云\python_files>python new1.py
DOCTYPE html>
--STATUS OK--><html> <head><meta http-equiv=c
et=utf-8><meta http-equiv=X-UA-Compatible con
ame=referrer><link rel=stylesheet type=text/c
w/cache/bdorz/baidu.min.css><title>百度一下,
#0000cc> <div id=wrapper> <div id=head> <div
rm> <div class=s_form_wrapper> <div id=lg> <i
om/img/bd_logo1.png width=270 height=129> </d
ww.baidu.com/s class=fm> <input type=hidden n
=hidden name=ie value=utf-8> <input type=hidd
en name=rsv_bp value=1> <input type=hidden na
den name=tn value=baidu><span class="bg s_ipt
pt value maxlength=255 autocomplete=off autof
r"><input type=submit id=su value=百度一下 cl
v> </div> <div id=u1> <a href=http://news.bai
闻</a> <a href=http://www.hao123.com name=tj_

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-30 11:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表