Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python 爬虫使用Requests获取网页文本内容中文乱码

Python 爬虫使用Requests获取网页文本内容中文乱码

作者头像
smartsi
发布于 2019-08-07 03:38:48
发布于 2019-08-07 03:38:48
14.3K00
代码可运行
举报
文章被收录于专栏:SmartSiSmartSi
运行总次数:0
代码可运行

1. 问题

使用Requests去获取网页文本内容时,输出的中文出现乱码。

2. 乱码原因

爬取的网页编码与我们爬取编码方式不一致造成的。如果爬取的网页编码方式为utf8,而我们爬取后程序使用ISO-8859-1编码方式进行编码并输出,这会引起乱码。如果我们爬取后程序改用utf8编码方式,就不会造成乱码。

3. 乱码解决方案

3.1 Content-Type

我们首先确定爬取的网页编码方式,编码方式往往可以从HTTP头(header)的Content-Type得出。

Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。如果未指定ContentType,默认为TEXT/HTML。charset决定了网页的编码方式,一般为gb2312utf-8

HTML语法格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
station_request = requests.get("http://blog.csdn.net/sunnyyoona")
content_type = station_request.headers['content-type']
print content_type  # text/html; charset=utf-8
3.2 chardet

如果上述方式没有编码信息,一般可以采用chardet等第三方网页编码智能识别工具识别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install chardet

使用chardet可以很方便的实现文本内容的编码检测。虽然HTML页面有charset标签,但是有些时候并不准确,这时候我们可以使用chardet来进一步的判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
raw_data = urllib.urlopen('http://blog.csdn.net/sunnyyoona').read()
print chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'utf-8'}

raw_data = urllib.urlopen('http://www.jb51.net').read()
print chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'GB2312'}

函数返回值为字典,有2个元素,一个是检测的可信度,另外一个就是检测到的编码。

3.3 猜测编码

当你收到一个响应时,Requests会猜测响应(response)的编码方式,用于在你调用Response.text方法时,对响应进行解码。Requests首先在HTTP头部检测是否存在指定的编码方式,如果不存在,则会使用 charadet来尝试猜测编码方式。

只有当HTTP头部不存在明确指定的字符集,并且Content-Type头部字段包含text值之时,Requests才不去猜测编码方式。在这种情况下, RFC 2616指定默认字符集必须是ISO-8859-1。Requests遵从这一规范。如果你需要一种不同的编码方式,你可以手动设置Response.encoding属性,或使用原始的Response.content

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一等火车站
url = "https://baike.baidu.com/item/%E4%B8%80%E7%AD%89%E7%AB%99"
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'}
r = requests.get(url, headers=headers)
print r.headers['Content-Type']  # text/html
# 猜测的编码方式
print r.encoding  # ISO-8859-1
print r.text  # 出现乱码

raw_data = urllib.urlopen(url).read()
print chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'utf-8'}

如上所述,只有当HTTP头部不存在明确指定的字符集,并且Content-Type头部字段包含text值之时,Requests才不去猜测编码方式。直接使用ISO-8859-1编码方式。而使用chardet检测结果来看,网页编码方式与猜测的编码方式不一致,这就造成了结果输出的乱码。

3.4 解决

你可以使用r.encoding = xxx来更改编码方式,这样Requests将在你调用r.text时使用r.encoding的新值,使用新的编码方式。下面示例使用chardet检测的编码方式解码网页:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一等火车站
url = "https://baike.baidu.com/item/%E4%B8%80%E7%AD%89%E7%AB%99"
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'}
r = requests.get(url, headers=headers)

# 检测编码
raw_data = urllib.urlopen(url).read()
charset = chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'utf-8'}
encoding = charset['encoding']
# 更改编码方式
r.encoding = encoding
print r.text  # 未出现乱码

参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://docs.python-requests.org/en/latest/user/quickstart/#response-content
http://blog.csdn.net/a491057947/article/details/47292923
https://www.cnblogs.com/GUIDAO/p/6679574.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
再也不用担心网页编码的坑了!
大家爬取网页的时候,应该都遇到过这种情况 当我打印网页源代码的时候 发现 全部是乱码的 那这个时候应该怎么办呢? requests是如何判断编码 首先,response.content返回的内容 是
爬虫
2018/04/08
9430
再也不用担心网页编码的坑了!
爬虫篇 | 认识Python最最最常用语重要的库Requests
最近整理一个爬虫系列方面的文章,不管大家的基础如何,我从头开始整一个爬虫系列方面的文章,让大家循序渐进的学习爬虫,小白也没有学习障碍.
龙哥
2019/10/10
5000
Python爬虫之requests库入门requests库的get方法理解requests库的异常爬去网页通用的代码框架resquests库主要方法的解析
网络爬虫就是提取网页的信息。 网络爬虫的原则就是谨记“the website is API”,就是我们所面对的对象和信息来源都是各个website。现在python由于其特性已经越来越被广泛的用于网络爬虫领域。
desperate633
2018/08/22
7800
Python爬虫之requests库入门requests库的get方法理解requests库的异常爬去网页通用的代码框架resquests库主要方法的解析
不要相信requests返回的text
Python的requests库是一个非常好用的库,这应该已经是大多写过爬虫的人的共识了。它的简洁易用给我们带来很大方便。然而,它也并不是非常完美。今天我们就说说它在处理中文编码方面的不足。
小小詹同学
2019/11/12
5280
使用 Python 爬取网页数据
urllib 是 Python 內建的 HTTP 库, 使用 urllib 可以只需要很简单的步骤就能高效采集数据; 配合 Beautiful 等 HTML 解析库, 可以编写出用于采集网络数据的大型爬虫;
IMWeb前端团队
2019/12/04
1.6K0
网络爬虫有什么用?怎么爬?手把手教你爬网页(Python代码)
导读:本文主要分为两个部分:一部分是网络爬虫的概述,帮助大家详细了解网络爬虫;另一部分是HTTP请求的Python实现,帮助大家了解Python中实现HTTP请求的各种方式,以便具备编写HTTP网络程序的能力。
IT阅读排行榜
2019/05/09
2.7K0
网络爬虫有什么用?怎么爬?手把手教你爬网页(Python代码)
python requests 网页编码问题
简介:不同的服务器采用的网页编码可能不一样,如果使用错误的编码发送数据,将不会得到正确的数据。
forxtz
2021/03/17
1.8K0
Python爬虫有用的库:chardet
练习爬虫的许多小伙伴,在爬取网页时,肯定遇到过页面乱码的情况,其实是网页编码没有成功配对。
远方的星
2021/08/11
1K0
Python爬虫有用的库:chardet
轻松解决Python “字符编码”,玩儿爬虫的朋友最爱这个库!
玩儿过爬虫的朋友应该知道,在爬取不同的网页时,返回结果会出现乱码的情况。比如,在爬取某个中文网页的时候,有的页面使用GBK/GB2312,有的使用UTF8,如果你需要去爬一些页面,知道网页编码很重要的。
小小詹同学
2021/04/19
6590
轻松解决Python “字符编码”,玩儿爬虫的朋友最爱这个库!
答疑解惑:Python爬虫时中文乱码的解决方案
这篇是我们答疑解惑的第2篇,不过这并不是粉丝的问题,而是才哥在爬虫时候遇到的情况,今天就记录一下。
可以叫我才哥
2021/09/24
1.3K0
《手把手带你学爬虫──初级篇》第2课 Requests库讲解
Requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。
GitOPEN
2019/01/12
9820
《手把手带你学爬虫──初级篇》第2课 Requests库讲解
Python爬虫--- 1.1请求库的安装与使用
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
緣來
2018/09/18
6100
Python爬虫--- 1.1请求库的安装与使用
爬虫必备库‘requests’详解(二)
今日分享:requests库详解 上一篇文章爬虫必备库‘requests’主要说了下Pytohn第三方库--Requests库的安装与简单测试,今天详细介绍Requests库的部分知识点,这些都是编写爬虫时经常用到的,虽然不是Requests库的全部内容,但是完全能够满足爬虫的需要。此外,相关要点的讲解会根据实例来进行说明,便于大家理解。 Requests库有七个主要的方法: requests.request() #构造一个请求,支撑以下各方法的基础方法;requests.get() #获取HTML网页
企鹅号小编
2018/02/27
6780
爬虫必备库‘requests’详解(二)
你还在为Python中文乱码而感到烦恼?今天老司机给你讲讲!
有没有遇到过这样的问题,读取文件被提示“UnicodeDecodeError”、爬取网页得到一堆乱码,其实这些都是编码惹的祸,如果不能真正理解编码的问题所在,就像开车没有带导航,游泳没有带有度数的眼镜。如果你正在为此而 头疼,不妨来看看这篇文章,里面或许有你要的答案。
QQ1622479435
2018/07/21
1.3K0
Python爬虫实战项目:简单的百度新闻爬虫
这个实战例子是构建一个大规模的异步新闻爬虫,但要分几步走,从简单到复杂,循序渐进的来构建这个Python爬虫
一墨编程学习
2019/05/14
3.3K0
Python爬虫准备:认识urllib/urllib2与requests
首先说明一下我的爬虫环境是基于py2.x的, 为什么用这个版本呢,因为py2.x的版本支持的多,而且一般会使用py2.x环境,基本在py3.x也没有太大问题,好了,进入正题!
龙哥
2018/10/22
4870
Requests爬虫
之前写过一个urllib的爬虫方法,这个库是python内建的,从那篇文章也可以看到,使用起来很繁琐。现在更流行的一个爬虫库就是requests,他是基于urllib3封装的,也就是将之前比较繁琐的步骤封装到一块,更适合人来使用。
py3study
2020/01/19
5660
【Python】【爬虫】Requests库详解
Requests是用Python语言编写的第三方库,使用前需要另外安装。它基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,完全满足HTTP测试需求,可以节约我们很多的工作。
阿黎逸阳
2020/09/08
1.3K0
【Python】【爬虫】Requests库详解
简单爬虫
理解Response异常 r.raise_for_status()如果不是200,产生异常requests.HTTPError异常
Cloud-Cloudys
2020/07/07
4380
Python 抓取网页乱码原因分析
在用 python2 抓取网页的时候,经常会遇到抓下来的内容显示出来是乱码。 发生这种情况的最大可能性就是编码问题:运行环境的字符编码和网页的字符编码不一致。 比如,在 windows 的控制台(gbk)里抓取了一个 utf-8 编码的网站。或者,在 Mac / Linux 的终端(utf-8)里抓取了一个 gbk 编码的网站。因为多数网站采用 utf-8 编码,而不少人又是用 windows,所有这种情况相当常见。 如果你发现你抓下来的内容,看上去英文、数字、符号都是对的,但中间夹杂了一些乱码,那基本可以
Crossin先生
2018/04/17
1.8K0
Python 抓取网页乱码原因分析
推荐阅读
相关推荐
再也不用担心网页编码的坑了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验