详解Python解决抓取内容乱码问题(decode和encode解码)

作者:浅然_ 时间:2021-12-18 09:26:29 

一、乱码问题描述

经常在爬虫或者一些操作的时候,经常会出现中文乱码等问题,如下

详解Python解决抓取内容乱码问题(decode和encode解码)

原因是源网页编码和爬取下来后的编码格式不一致

 二、利用encode与decode解决乱码问题

字符串在Python内部的表示是unicode编码,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘utf-8'),表示将unicode编码的字符串str2转换成utf-8编码。

decode中写的就是想抓取的网页的编码,encode即自己想设置的编码

代码如下


#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: xulinjie time:2017/10/22
import urllib2

request=urllib2.Request(r'http://nhxy.zjxu.edu.cn/')
RES=urllib2.urlopen(request).read()
RES = RES.decode('gb2312').encode('utf-8')//解决乱码
wfile=open(r'./1.html',r'wb')
wfile.write(RES)
wfile.close()
print RES

或者


#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: xulinjie time:2017/10/22
import urllib2

request=urllib2.Request(r'http://nhxy.zjxu.edu.cn/')
RES=urllib2.urlopen(request).read()
RES=RES.decode('gb2312')
RES=RES.encode('utf-8')
wfile=open(r'./1.html',r'wb')
wfile.write(RES)
wfile.close()
print RES

但是还要注意:
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断

isinstance(s, unicode)#用来判断是否为unicode

用非unicode编码形式的str来encode会报错

所以最终可靠代码:


#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: xulinjie time:2017/10/22
import urllib2

request=urllib2.Request(r'http://nhxy.zjxu.edu.cn/')
RES=urllib2.urlopen(request).read()

if isinstance(RES, unicode):
RES=RES.encode('utf-8')
else:
RES=RES.decode('gb2312').encode('utf-8')

wfile=open(r'./1.html',r'wb')
wfile.write(RES)
wfile.close()
print RES

详解Python解决抓取内容乱码问题(decode和encode解码)

三、如何找到需要抓取的目标网页的编码格式

1、查看网页源代码

详解Python解决抓取内容乱码问题(decode和encode解码)

如果源代码中没有charset编码格式显示可以用下面的方法

2、检查元素,查看Response Headers

详解Python解决抓取内容乱码问题(decode和encode解码)

以上所述是小编给大家介绍的Python解决抓取内容乱码问题(decode和encode解码)详解整合网站的支持!

来源:https://blog.csdn.net/w_linux/article/details/78370218

标签:Python,抓取,乱码,decode,encode
0
投稿

猜你喜欢

  • Python 输出详细的异常信息(traceback)方式

    2023-01-17 11:43:48
  • Vue+Axios实现文件上传自定义进度条

    2024-05-29 22:24:57
  • axios请求的一些常见操作实战指南

    2023-07-02 16:33:25
  • 调整Jupyter notebook的启动目录操作

    2022-04-02 19:40:58
  • 两个asp函数实现javascript的escape函数和unescape函数功能

    2009-02-04 15:47:00
  • SQL Server 2005日志文件损坏的处理方法

    2008-12-02 14:36:00
  • Oracle 的入门心得 强烈推荐

    2009-05-24 19:55:00
  • Python语法学习之进程间的通信方式

    2023-04-03 11:30:28
  • Python3.7 读取 mp3 音频文件生成波形图效果

    2022-09-08 18:02:25
  • php提示Failed to write session data错误的解决方法

    2023-11-21 21:02:39
  • pytorch SENet实现案例

    2021-03-27 05:14:23
  • Android+OpenCv4实现边缘检测及轮廓绘制出图像最大边缘

    2022-04-08 18:05:44
  • mysql如何跨时区迁移数据

    2010-03-25 10:26:00
  • JS获取select的value和text值的简单实例

    2024-04-19 09:50:11
  • 发个选星星打分/投票功能函数

    2008-05-22 12:38:00
  • NLTK 3.2.4 环境搭建教程

    2023-09-14 03:47:27
  • 在matplotlib的图中设置中文标签的方法

    2023-10-10 07:17:53
  • 详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    2024-01-24 03:27:04
  • 详解Python遍历字典的键和值

    2021-07-19 23:02:14
  • 几个javascript显示加载进度条代码

    2008-01-19 10:52:00
  • asp之家 网络编程 m.aspxhome.com