解码python_Python解码
2016.3.3部分
上手爬虫第一天,就遇到了一个麻烦的问题:解码解不出来。
先上源码:
import urllib
import urllib.request
data = {}
data['word'] = 'LEGO'
url_values = urllib.parse.urlencode(data)
url = 'http://www.baidu.com/s?'
full_url = url + url_values
response = urllib.request.urlopen(url)
data = response.read()
data = data.decode('utf8')
print (data)
这段代码就等于是在百度搜索“LEGO”,然后读取搜索到的网页结果。跑一下,发现提示UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbe in position 60: invalid start byte。上网查了下资料,发现有几三个地方没太搞懂,搞懂了就能解决这个解码问题了:
response.read()返回的到底是什么编码字符?是html的代码对吧,那么这个html代码是用什么方法来编码的呢?
decode('?')中需要用什么编码方式才能正确解码?如果知道问题1的答案,那么这个问题2也容易解决了。由于不知道是什么编码方式,那么将?一个个使用uft8、big5、unicode、gbk等编码方式尝试,结果都是类似的提示,只是报错的行数不同。
我在网上尝试了一下解码后再次编码的方法,变成了data = data.decode('utf8').encode('gbk'),看能不能有突破,发现不行后,删掉了后加上的代码,只保留data = data.decode('utf8'),结果运行.py后还一直提示UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 25145: illegal multibyte sequence,最后只能是将整行注释掉才恢复正常(输出html源码),但去掉注释后又弹出encode提示,代码中明明没有了encode啊!我的内心几乎是崩溃的!
在继续查资料后,决定先放下这个解码问题,先做好数据存储那一块,再回头慢慢解决切割和解码问题,没准到时候就懂了。
2016.3.10部分
在使用了Requests和BeautifulSoup第三方库后,打算将爬到的数据打印出来看一下:
import requests
import urllib.parse
from bs4 import BeautifulSoup
response = requests.get('http://www.baidu.com')
soup = BeautifulSoup(response.text, "html.parser")
print (soup.title.text)
print (soup.body.text)
结果,还是报了跟之前一样的编码错误:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 12734: illegal multibyte sequence,于是继续查,终于找到原因了。
解决方法如下:
忽略cmd的显示问题,直接存为文件输出
其实呢,这是windows控制台本身的显示编码, 在dos窗口标题,右键菜单选择属性,可以看到控制台的默认编码为GBK(cp936)。
所以说,问题不在python,不在网页,而是那个呆板的dos控制台。
解决方法呢,简单点可以写到本地文件中查看,复杂点的就留给你去折腾了。 注意,这只是dos控制台的显示问题,对于其中字符串的处理完全不受阻碍。 看不看得见,它就在内存里,该干嘛还干嘛。
使用函数将爬取的数据保存为文件
def save_file(data, path):
files = open(path, 'wb')
files.write(data)
files.close()
save_file(soup.title.text, 'p7_title.txt')
save_file(soup.body.text, 'p7_body.txt')
结果报了另外一个错:TypeError: a bytes-like object is required, not 'str',那么再对爬到的数据使用strip再encode的方法
save_file(soup.title.text.strip('\00').encode(), 'p7_title.txt')
save_file(soup.body.text.strip('\00').encode(), 'p7_body.txt')
如此一来,虽然是绕弯解决的,没有直面问题,但还是顺利解决了问题,并且已经拿到了需要的数据。
相关资料
解码python_Python解码相关推荐
- 视频编解码(十六):VE解码器解码demo解码流程
一.VE解码器解码demo解码流程 解码器初始化.创建.读取码流.解码.显示
- SkeyeARS 8K视频播放器软解码硬解码功能实现
SkeyeARS 8K视频播放器软解码&硬解码功能实现 首先,我们简单了解一下软解码&硬解码: 软解码:由CPU负责解码进行播放 优点:不受视频格式限制.画质可能略好于硬解缺点:会占用 ...
- 实时音频编解码之十七 Opus解码 SILK解码
本文谢绝任何形式转载,谢谢. 5.2 Silk解码流程 解码器线性预测层主要使用长短时预测合成滤波器对激励信号滤波实现,线性预测层内部的工作带宽为NB.MB以及WB,对于SWB以及FB的混合编码工作模 ...
- php 值不进行解码,无法解码PHP中的JSON值
我没有找到解决方法. 我有一个API女巫给我JSON resposne, 这是这样的, {"search":{"q":"\u0633\u0644\u0 ...
- python解码函数_Python字符串中的两个解码与解码函数详解
Python字符串作为计算机语言中被广泛应用的语言.很少有人知道Python字符串中有两个编码和解码的函数.以下是文章的介绍,希望你能从以下的文章中会有所收获,下面是文章的介绍. Python字符串, ...
- python3解码base64_python3base64解码混乱的换行符
我试图通过标准的python库对base64多行文件进行解码,但是只有第一行被解码,其余的则无缘无故地被丢弃.在 为什么会这样?在 编码前的文件(解码后我要实现的目标):dataFile.dat VE ...
- 2262 c语言软件解码,单片机解码315M的pt2262编码的c51程序
这是一个用软件来解码pt2262信号的c51程序,经过测试是可以使用的,要注意接受模块要远离单片机的晶振 不然干扰太严重无法解码的 或者距离很近. /*------------------------ ...
- surface 解码_解码强音效优 随时随地轻松看电影_微软 Surface Pro 3_平板电脑评测-中关村在线...
解码强音效优 随时随地轻松看电影 有了高素质的显示屏,轻薄机身,以及可解放双手的支架保证,微软Surface Pro 3离成为随身影院仅差一步.但这一步微软也完全考虑到了,其对内置音箱位置也进行了重新 ...
- silk 编解码_Silk解码 开发日志
标签: 本人用的是SILK_SDK_SRC_v1.0.9进行开发.开发过程是曲折的,结果自然也是丰盛的. SDK是从github下载的,由于这个已被整合到一个Android项目,但是文件目录结构尚完整 ...
最新文章
- jenkins 下载插件 一直失败_Jenkins 配置国内插件更新源
- arcsde 和oracle(双机热备)分布式安装(转载)
- 中央音乐学院计算机研究生,2020北京中央音乐学院硕士研究生招生复试电子音乐作曲、电子音乐技术理论等考生须知...
- Firefox 技巧
- Python根据正则表达式找到相应的字符串然后进行替换
- 高中理科不好学计算机,高一理科很差但想学理咋办
- 软件测试:职场上那些你不得不学会的事儿
- vue 心跳监控_Vue中WebSocket加入心跳机制
- Kotlin的匿名方法实现接口回调
- 【学习Spring框架】依赖注入和控制反转异同?
- cacti监控linux和windows磁盘io,为CactiEZ(或者Cacti)增加监控磁盘IO功能
- 层次分析法(AHP)介绍
- fzu 2122 又见LKity
- 中医基础理论第二章藏象(心)
- SAP ABAP 输出设备设置 LP01
- The type new ActionListener(){} must implement the inherited abstract method ActionListener.actionPe
- Python中计算圆的周长,面积
- 怎样学好中医,非常值的一读
- 印刷方式——标识丝印工艺
- 谈谈商业分析的思维养成