python3爬虫编码问题
使用爬虫爬取网页经常遇到各种编码问题,因此产生乱码
今天折腾了一天,全部总结一遍
环境:win10,pycharm,python3.4
1.首先先来网页编码是utf-8的:
以百度首页为例:
使用requests库
import requests
url="http://www.baidu.com"
response = requests.get(url)
content = response.text
print(content)
结果有代码显示,但是出现乱码
使用urllib库
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read())
结果有代码显示,但是以二进制返回
接下来介绍encode()和decode()方法
encode()用于解码,decode()方法用于编码
注:python3默认编码为utf-8
例1:
text = '中华'
print(type(text))
print(text.encode('gbk'))#以gbk形式解码,即把utf-8的字符串text转换成gbk编码
print(text.encode('utf-8'))#以utf-8形式解码,因为原本是utf-8编码,所以返回二进制
print(text.encode('iso-8859-1'))#报错
返回结果:
<class 'str'>
b'\xd6\xd0\xbb\xaa'
b'\xe4\xb8\xad\xe5\x8d\x8e'
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
为什么第四个报错?
我查寻了一下latin-1是什么?
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
ISO-8859-1编码是单字节编码。
Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符(这里认为unicode是两个字节,事实上因为各种版本不一样,字节数也不一样)
所以我的理解是:因为中文至少两个字节,所以不能解码出来
例2:
text = '中华'
print(type(text)) #<class 'str'>
text1 = text.encode('gbk')
print(type(text1)) #<class 'bytes'>
print(text1) #b'\xd6\xd0\xbb\xaa'
text2 = text1.decode('gbk')
print(type(text2)) #<class 'str'>
print(text2) #中华
text3 = text1.decode('utf-8') #报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
print(text3)
text4= text.encode('utf-8')
print(type(text4)) #<class 'bytes'>
print(text4) #b'\xe4\xb8\xad\xe5\x8d\x8e'
text5 = text4.decode('utf-8')
print(type(text5)) #<class 'str'>
print(text5) #中华
text6 = text4.decode('gbk') #报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
print(text6)
为什么text3和text6会报错呢?
因为他们解码和编码使用的编码标准不一样。text1是用gbk解码,那么用utf-8编码回去就会报错,text6同理
好,回到百度例子,那么我们要怎么样才能看到我们想要的网页源代码呢?
使用requests库
import requests
url="http://www.baidu.com"
response = requests.get(url)
content = response.text.encode('iso-8859-1').decode('utf-8')
#把网页源代码解码成Unicode编码,然后用utf-8编码
print(content)
使用urllib库
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode(utf-8))
2.关于网页源代码是gbk或者gb2312编码的网页:
import requests
response = requests.get('http://www.dytt8.net/')
#print(response.text)
html = response.text
print(html)
结果返回乱码
import urllib.request
#get请求
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read())
结果返回二进制
正确代码:
import requests
response = requests.get('http://www.dytt8.net/')
#print(response.text)
html = response.text.encode('iso-8859-1').decode('gbk')
print(html)
import urllib.request
#get请求
response = urllib.request.urlopen('http://www.dytt8.net/')
print(response.read().decode('gbk'))
python3爬虫编码问题的更多相关文章
- python3爬虫中文乱码之请求头‘Accept-Encoding’:br 的问题
当用python3做爬虫的时候,一些网站为了防爬虫会设置一些检查机制,这时我们就需要添加请求头,伪装成浏览器正常访问. header的内容在浏览器的开发者工具中便可看到,将这些信息添加到我们的爬虫代码 ...
- s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法
python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...
- Python3爬虫系列:理论+实验+爬取妹子图实战
Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star 爬虫系列: (1) 理论 Python3爬虫系列01 ...
- day008 字符编码之 字符编码 、Python2和Python3字符编码的区别
计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...
- Python3 爬虫之 Scrapy 核心功能实现(二)
博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的搭建过程请参照本人的另一篇博客:Python3 爬虫之 Scrap ...
- Python3 爬虫之 Scrapy 框架安装配置(一)
博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...
- Python3的编码整理总结
python3在内存中是用unicode编码方式存储的,所以不能直接储存和传输,要转化为其他编码进行储存和传输. 字符串通过编码转换成字节码,字节码通过解码成为字符串 encode:str --> ...
- 字符编码 + python2和python3的编码区别(day08整理)
目录 昨日回顾 二十三.元组内置方法 二十四.散列表 二十五.字典内置方法 二十六.集合内置方法 二十七.深浅拷贝 拷贝 浅拷贝 深拷贝 今日内容 二十八.字符编码 1.文本编辑器存储信息的过程 2. ...
- python3爬虫--反爬虫应对机制
python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需 ...
随机推荐
- jquery对象与核心函数
原生js入口函数与jQuery入口函数的区别 1.window.onload与document.ready在加载时间上的差异 document.ready会先触发,其次才是window.onload ...
- csharp: using OleDb Getting the identity of the most recently added record
/// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="SQLString&quo ...
- img底部空白以及多余的空白文本节点解决方案
1:img底部有空白的问题 img的css属性display的默认值是inline,这样会导致img的vertical-align的默认值是 baseline; baseline又不是bottom,只 ...
- java压缩与解压
一 概述 1.目录进入点 目录进入点是文件在压缩文件中的映射,代表压缩文件.压缩文件时,创建目录进入点,将文件写入该目录进入点.解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件. 如果目录 ...
- 使用Calendar加一天,减一天
public class Test { public static void main(String[] args) { Calendar c=Calendar.getInstance(); Simp ...
- 配合sublime使用flexible.js实现微信开发页面自适应
什么是flexible.js 是一个终端设备适配的解决方案.也就是说它可以让你在不同的终端设备中实现页面适配. 是一个用来适配移动端的javascript框架.根据宽度的不同设置不同的字体大小,样式间 ...
- 如何让div覆盖canvas元素
第一步 请让该div和canvas同样处于同一画布,都用position:absolute; 然后设置canvas的z-index="-1",是的,你没看错 然后把要覆盖canva ...
- 把连接中传的参数截取出来变成一个json对象
获取url function test() { var url=window.location.search; if(url.indexOf("?")!=-1) { var str ...
- 讲解JavaScript两个圆括号、自调用和闭包函数
一.JavaSript圆括号的使用 先来看一组通过函数声明来定义的函数: 先附代码: 运行结果如下: 这里我们可以看出: Ø 若没有加圆括号,则返回的是这个函数的内容 Ø 若加上圆括号,则返回的是 ...
- ArcGIS 10.1 如何连接数据库(转载)
ArcGIS 10.1如何连接数据库 最近在使用ArcGIS 10.1的数据库,在使用的过程中发现了跟以往不太一样的地方,在这里将自己的心得和想法跟大家分享一下(使用Postgresql),根据使用过 ...