整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用requests爬虫「中文乱码」的解决方法

equests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。对于初学者来说采集的数据【中文乱码】问题是很烦恼的。

本文将根据实践经验说明python中使用requests库编写爬虫程序时,出现【中文乱码】的原因及解决办法。

首先,本文的【中文乱码】情况,指的是原网页中的中文内容在使用requests获取后,中文完全无法识别的情况,区别于\x、\u等编码情况。如下图中的例子:

导致上图中【中文乱码】的原因:

使用requests库时,选择使用的文本响应方法不合适,且没有在代码中添加设置合适的编码,以致于使用【response.text】自动获取到的网页编码,与实际网页的编码不一致,进而产生【中文乱码】。

使用requests库时,可能已经形成了一个习惯,常用【response.text】进行文本响应,而【response.content】常用于图片、视频等。

这两者,最大的一个区别就是:

1、【response.text】会自动根据HTTP头部去推测网页的编码,解码并返回解码后的文本。

2、【response.content】不会解码,直接以二进制形式返回。

两种文本响应方法,如下表:

response.text

服务器响应的内容,会自动根据响应头部的字符编码进行解码。根据HTTP头部对响应的编码做出有根据的推测,推测文本编码。返回类型:str;常用于:响应文本

response.content

字节方式的响应体,不会根据HTTP头部对响应的编码做出有根据的推测。返回类型:bytes(二进制);常用于:图片、视频

最有效的解决方法:

获取网页编码、指定其编码,再提取文本

使用response的encoding、apparent_encoding,得到网页编码。

encoding、apparent_encoding两者最大的区别:

encoding是从header中去提取,而apparent_encoding是从网页源码去解析,apparent_encoding得到的结果更准确。

详细如下表:

response.encoding

从网页响应的header中,提取charset字段中的编码。若header中没有charset字段,则默认为ISO-8859-1编码模式,ISO-8859-1编码无法解析中文,这也是中文乱码的原因。

response.apparent_encoding

从网页的内容中(html源码)中分析网页编码的方式。所以apparent_encoding比encoding更加准确,获取到的才是原网页的实际编码。

print(response.apparent_encoding)
print(response.encoding)

使用encoding、apparent_encoding两种方法,所得的结果是不一致的,apparent_encoding才是原网页实际编码。如下图

根据上述方法,获得原网页的实际编码后,手动在代码中指定文本编码格式,即可解决【中文乱码】问题。如下图:

response.encoding=response.apparent_encoding

以上就是使用requests爬虫解决中文乱码的方法,如那位老师有更好的方法还望赐教,谢谢!

多网站前端设计师在设计网站的时候,都会碰到网站在快速浏览器下显示正常,在ie下可能就会出现错位的情况!所以我们在设计网站之前一定要先了解IE兼容性问题。

关于CSS对IE的兼容问题一直是DIV+CSS的一个大问题,因为不通浏览器识别代码产生的效果是不同的,所以造成了很多浏览器对相同的CSS,产生不同的效果,这样就产生了网站的错位,个人理解是这样的。

网站设计

先来了解下浏览器的内核:

浏览器内核又可以分成两部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎。它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。JS 引擎则是解析 Javascript 语言,执行 javascript 语言来实现网页的动态效果。

最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。有一个网页标准计划小组制作了一个 ACID 来测试引擎的兼容性和性能。内核的种类很多,如加上没什么人使用的非商业的免费内核,可能会有 10 多种,但是常见的浏览器内核可以分这四种:Trident、Gecko、Blink、Webkit。

各个浏览器内核不同,就可能造成不兼容的情况出现。

常见的兼容性问题:

1、不同浏览器的标签默认的外补丁( margin )和内补丁(padding)不同

解决方案: css 里增加通配符 * { margin: 0; padding: 0; }

2、IE6双边距问题;在 IE6中设置了float , 同时又设置margin , 就会出现边距问题

解决方案:设置display:inline;

3、当标签的高度设置小于10px,在IE6、IE7中会超出自己设置的高度

解决方案:超出高度的标签设置overflow:hidden,或者设置line-height的值小于你的设置高度

4、图片默认有间距

解决方案:使用float 为img 布局

5、IE9一下浏览器不能使用opacity

解决方案:

opacity: 0.5;filter: alpha(opacity = 50);filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50);

6、边距重叠问题;当相邻两个元素都设置了margin 边距时,margin 将取最大值,舍弃最小值;

解决方案:为了不让边重叠,可以给子元素增加一个父级元素,并设置父级元素为overflow:hidden;

7、cursor:hand 显示手型在safari 上不支持

解决方案:统一使用 cursor:pointer

8、两个块级元素,父元素设置了overflow:auto;子元素设置了position:relative ;且高度大于父元素,在IE6、IE7会被隐藏而不是溢出;

解决方案:父级元素设置position:relative

关于浏览器兼容性的这种错位,因为浏览器的种类越来越多,从IE5,6,7,8,9,10这些都是比较常用的浏览器,但是正因为各种浏览器的出现,为了更好的兼容各个版本的浏览器,我们就需要学习如何来处理IE的兼容问题。从而网络上出现了很多所谓的HACK ,其实也就是针对各个浏览器的特点,来对各种浏览器的不同嗜好,产生的不同效果,实现的一种兼容各个版本浏览器的效果。

这个地方我们我们不是来讲各种可见的HACK效果,这些大家,可以在百度上来一下,就能找到我们所要的结果。

因为IE从6开始为了适应各个版本,就自身有了一个兼容性,所以我们可以指定给网页一个兼容特性;

比如 网页在IE7下无错位,但在IE6 和 IE8下有错位,那么我们就可以指定当用户使用IE6和IE8的时候直接指定给IE6 和 IE8采用IE7的兼容模式来实现网页的不错位。

但是这样一来,网页的兼容特性只是实现了,IE6,IE7,IE8的一个兼容,为了同时兼容FF,我们这个时候就需要使用HACK来达到兼容FF的效果。

这样我们使用IE自身的特性和HACK之间的特性就达到了网页的兼容效果,我认为这样实现兼容效果是最简单最方便的。这样我们其实就是对一种IE和FF之间的HACK在起作用,相对的写了很少的代码,也很实用和方便。

兼容性的问题越来越重要了,特别是IE8的出现让当时大半的网页都出现错位等现象,而解决的办法,我们来看一个网上的例子:

“css兼容IE8

微软在IE8提供三种解析页面的模式:

IE8 Standard Modes :默认的最标准的模式,严格按照W3C相关规定

IE7 Standards Modes :IE7现在用的解析网页的模式,开起机关是在<head>中加入 <meta http-equiv="X-UA-Compatible" content="IE=7">

Quirks Modes :IE5用的解析网页的模式,开起机关是删除HTML顶部的DOCTYPE声明

注意:不同模式间的网页在IE8中可以互相 frame ,因此因不会模式下的DOM和CSS渲染不一样,所以会引发很多问题,务必注意如果你的页面对IE7兼容没有问题,又不想大量修改现有代码,同时又能在IE8中正常使用,微软声称,开发商仅需要在目前兼容IE7的网站上添加一行代码即可解决问题,此代码如下:

<meta http-equiv="x-ua-compatible" content="ie=7" />”

加了以上这个代码,就可以比较完美的解决一般的兼容性问题了。

位小伙伴今天我们来了解

JavaWeb 中的 Response

1)HttpServletResponse 概述

我们在创建 Servlet 时会覆盖 service() 方法,或 doGet()/doPost(),这些方法都有两个参数,分别是代表请求的 request 和代表响应 response。(今天我们主要来说说 response)

service 方法中的 response 的类型是 ServletResponse,而 doGet/doPost 方法的 response 的类型是 HttpServletResponse,HttpServletResponse 是ServletResponse 的子接口,功能和方法更加强大,所以今天我们来学习的就是 HttpServletResponse。

2)response 的运行流程

当我们通过页面请求 web 应用的时候,Tomcat 就会创建一个 request 对象,和一个 response 对象一起传进 Servlet 中,然后 Tomcat 会把response 缓冲区中的内容取出来 包装成一个 http 响应返回页面~

因为 response 代表响应,所以我们可以通过该对象分别设置 Http 响应的响应行,响应头和响应体

3)通过response设置响应行

常用的状态码如下:

200 :请求成功。

302 :请求重定向。

304 :请求资源没有改变,访问本地缓存。

404 :请求资源不存在。

500 :服务器内部错误。

通过 setStatus(int sc)方法可以设置响应行的状态码。

4)通过 response 设置响应头

方法:

addHeader(String name, String value)

addIntHeader(String name, int value)

addDateHeader(String name, long date)

setHeader(String name, String value)

setDateHeader(String name, long date)

setIntHeader(String name, int value)

其中,add表示添加,而set表示设置(会替换掉先前的内容)

5)重定向

重定向的意思:就好像我们去找张三借钱,张三没钱,然后告诉我们李四有,让我们去找李四。我们收到这个消息之后,就去找李四了。这就是一个重定向的过程。

下面用代码来演示一下:

首先设置状态码302,然后设置页面的路径~

这样在我们访问 Servlet1 的时候,页面就会跳转到 Servlet2 。

这个就是重定向了~我们也可以把 Servlet1 中的两句代码简化成为一行

这个是Sun公司为我们封装好玩的呦~

6)通过 response 设置响应体

响应体设置文本

PrintWriter getWriter()

获得字符流,通过字符流的 write(String s) 方法可以将字符串设置到 response 缓冲区中,随后 Tomcat 会将 response 缓冲区中的内容组装成 Http 响应返回给浏览器端。

关于设置中文的乱码问题

response 缓冲区的默认编码是 iso8859-1,此码表中没有中文,可以通过 setCharacterEncoding(String charset) 设置 response 的编码。但是这样客户端还是不能正常显示文字。

因为浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是 GBK

我们可以通过 response 的 setContentType(String type) 方法指定页面解析时的编码是UTF-8。

因为该方法含有 setCharacterEncoding 的功能,所以在实际开发中只要编写 response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题了。

那么今天就到这里了

伙伴们再见了

我是萌新娜娜

立志做一个不翻车的老司机

学习Java的路上请多多指教

大家如果想要更深入了解java相关知识,私信我回复:【Java】 即可知道你们想要知道的java相关问题