爬虫中 r.text 与 r.content 的区别

Posted wyy1480

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫中 r.text 与 r.content 的区别相关的知识,希望对你有一定的参考价值。

1.简单粗暴来讲:

text 返回的是unicode 型的数据,一般是在网页的header中定义的编码形式。

content返回的是bytes,二级制型的数据。

如果想要提取文本就用text

但是如果你想要提取图片、文件,就要用到content

2.详细一点来讲:

用了request.get方法后,返回一个response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。

其中返回的网页部分会存在.content和.text两个对象中。如果需要获得这些网页原始数据,我们可以通过r.text 或 r.content来获取数据。

  • .text 存的是.content 编码后的字符串
  • .content中间存的是字节码

一般来说 .text直接用比较方便,返回的是字符串,但是有时候会解析不正常,导致返回的是一堆乱码。这时需要用.content.decode(‘utf-8‘),使其正常显示。

总的来说.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常(需要用.content.decode()进行手动编码)

3.举栗子

3.1 例一 r.text

输入:

import requests
response = requests.get("http://m.news.cctv.com/2019/09/12/ARTI80tyFZxlGernTG2Wljf7190912.shtml")
print(response.text)
print("Finish!")

输出结果:

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="filetype" content="1"> 
<meta name="publishedtype" content="1"> 
<meta name="pagetype" content="1"> 

<meta name="author" content="?? ??§???"> 
<meta name="source" content="?¤?è§???°é????¢??·??ˉ"> 
<title>????????°é???????¨?o??¥???°??-?????????70??¨?1′????¤?????1 è???13??o???è§??ˉ?è????a??°??1???_?¤?è§???°é????¢??·??ˉ_?¤?è§????(cctv.com)</title>    
    var commentTitle = "????????°é???????¨?o??¥???°??-?????????70??¨?1′????¤?????1 è???13??o???è§??ˉ?è????a??°??1???"; //èˉ?è?o? ?é¢?
    /* èˉ?è?o?ˉ1è±?ID 20?????¥???????-???|??2 ?ˉ???aè¢?èˉ?è?o?ˉ1è±???????20120420------ */(此处省略一万字)  </script>
<!--Gridsum tracking code end. -->
</body>
</html>
Finish!

明显看到有乱码出现,在例三解决。

3.2 例二 r.content

输入:

import requests
response = requests.get("http://m.news.cctv.com/2019/09/12/ARTI80tyFZxlGernTG2Wljf7190912.shtml")
print(response.content)
print("Finish!")

输出结果:

b'   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\\r\\n<html xmlns="http://www.w3.org/1999/xhtml">\\r\\n<head>\\r\\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\\r\\n<meta name="filetype" content="1"> \\r\\n<meta name="publishedtype" content="1"> \\r\\n<meta name="pagetype" content="1"> \\r\\n\\r\\n<meta name="author" content="\\xe5\\xbc\\xa0\\xe6\\x85\\xa7\\xe5\\xbd\\xac"> \\r\\n<meta name="source" content="\\xe5\\xa4\\xae\\xe8\\xa7\\x86\\xe6\\x96\\xb0\\xe9\\x97\\xbb\\xe5\\xae\\xa2\\xe6\\x88\\xb7\\xe7\\xab\\xaf"> \\r\\n\\r\\n\\r\\n<title>\\xe6\\x97\\xb6\\xe6\\x94\\xbf\\xe6\\x96\\xb0\\xe9\\x97\\xbb\\xe7\\x9c\\xbc\\xe4\\xb8\\xa8\\xe5\\xba\\x86\\xe7\\xa5\\x9d\\xe6\\x96\\xb0\\xe4\\xb8\\xad\\xe5\\x9b\\xbd\\xe6\\x88\\x90\\xe7\\xab(此处省略一万字)ript type=\\'text/javascript\\'>\\r\\n    (function () \\r\\nvar s = document.createElement(\\'script\\');\\r\\ns.type = \\'text/javascript\\';\\r\\ns.async = true;\\r\\ns.src = (location.protocol == \\'https:\\' ?\\'https://ssl.\\' : \\'http://static.\\') + \\'gridsumdissector.com/js/Clients/GWD-002757-56B3A5/gs.js\\';\\r\\nvar firstScript = document.getElementsByTagName(\\'script\\')[0];\\r\\nfirstScript.parentNode.insertBefore(s, firstScript);\\r\\n    )();\\r\\n</script>\\r\\n<!--Gridsum tracking code end. -->\\r\\n</body>\\r\\n</html>'
Finish!

与r.text相比,多了b开头,这是bytes的标志哟(字节字符串),要用的话还要编码一下。

3.3 例三 r.text出现乱码,怎么解决(例一作乱码示范)

输入:

import requests
response = requests.get("http://m.news.cctv.com/2019/09/12/ARTI80tyFZxlGernTG2Wljf7190912.shtml")
print(response.content.decode('utf-8'))
print("Finish!")

输出结果:

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="filetype" content="1"> 
<meta name="publishedtype" content="1"> 
<meta name="pagetype" content="1"> 

<meta name="author" content="张慧彬"> 
<meta name="source" content="央视新闻客户端"> 


<title>时政新闻眼丨庆祝新中国成立70周年前夕,xxx为何视察这个地方?_央视新闻客户端_央视网(cctv.com)</title>
<meta name="catalogs" content="PAGE137(此处省略一万字)
</script>
<!--Gridsum tracking code end. -->
</body>
</html>
Finish!

与例一对比,这里用了.content.decode(‘utf-8‘)后就没有乱码啦,get到了吗?

3.4 例四 r.content() 打开图片,写入相关数据

输入:

import requests
response = requests.get("http://b-ssl.duitang.com/uploads/item/201707/20/20170720111208_EHX2K.jpeg")
with open("love_img.jpeg","wb") as f: 
     f.write(response.content)
print(response.content)
print("Finish!")

输出结果:
b‘\\xff\\xd8\\xff\\xe0\\x00\\x10JFIF\\x00\\x01\\x01\\x00\\x00\\x01\\x00\\x01\\x00\\x00\\xff\\xdb\\x00C\\x00\\x03\\x02\\x02\\x03\\x02\\x02\\x03\\x03\\x03\\x03\\x04\\x03\\x03\\x04\\x05\\x08\\x05\\x05\\x04\\x04\\x05\\n\\x0(省略一万字)\\xdf\\x93\\xff\\x00Cj(\\xa6#\\xa7P6t\\xedQ\\x1e\\xa6\\x8a(\\x01(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00(\\xa2\\x8a\\x00\\xff\\xd9‘
Finish!

3.4 例四 用r.text() 看图片,将出现乱乱乱码

输入:

import requests
response = requests.get("http://b-ssl.duitang.com/uploads/item/201707/20/20170720111208_EHX2K.jpeg")
print(response.text)
print("Finish!")

输出结果:

?????JFIF?????????C?


?????"?????????????? 
????????!1AQa"q2???#B??R??$3br? 
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz???????????????????????????????????????????????????????????????????????????????????   
??????w?!1AQaq"2?B????   #3R?br?(此处省略一万字)
????Cj(?#?P6t?Q??((???(???(???(???(???(???(???(???(???(???(???(???(???(?????
Finish!

好的,你get到了吗?
又是一年中秋,月是故乡明,祝大家中秋快乐,家庭幸福。
技术图片

以上是关于爬虫中 r.text 与 r.content 的区别的主要内容,如果未能解决你的问题,请参考以下文章

requests库基本使用

google

google

爬取京东乱码问题

getpost

Python 3 Anaconda 下爬虫学习与爬虫实践