Python技术迷

requests.content 和 requests.text 到底有啥区别?

都说程序员眼中只有两种数据类型:字符串和不是字符串。尤其是干爬虫的兄弟姐妹,对这个更是深有体会。今天咱就来说一个经典问题:requests.content 和 requests.text 到底有啥区别?

说实话,刚学 Python 那会儿,我也被这俩玩意儿整懵过——明明都能拿到响应内容,一个加个 .text,一个 .content,非得分开搞。这就像你买泡面,结果店家非得问你是要“面”还是“汤”,咋的,还不能一起打包?后来才明白:人家这区别,是真有讲究。

requests.text 和 requests.content 到底差在哪?

一句话总结:

  • • response.text 👉 返回的是字符串,已经解码过了。
  • • response.content 👉 返回的是原始的字节数据,还没解码。

用代码说话吧:

import requests

url = 'https://example.com'
response = requests.get(url)

print(type(response.content))  # <class 'bytes'>
print(type(response.text))     # <class 'str'>

你要是拿 .content,拿到的是 bytes 类型,就像你点外卖点来了一整袋生米;
你要是拿 .text,拿到的是 str 类型,说明人家饭都帮你煮熟了🍚。

那到底用哪个更好?

我一般是这么分情况处理的:

✅ 如果你要处理的是网页(HTML)

就用 .text,因为 requests 会根据响应头里的 Content-Type 和 encoding 自动给你解码,省事。

html = response.text

但这事吧,也不能太信它,requests 有时候也懵,尤其碰到服务端编码没写清楚或者不规范的。比如网页是 gbk 编码的,结果服务器 header 里写了个 utf-8,你 .text 一解析,直接乱码警告⚠️。

这时候你可以手动指定编码:

response.encoding = 'gbk'
html = response.text

你手动告诉它怎么煮饭,requests 也就不再乱加调料了。

✅ 如果你是搞文件下载,比如图片、PDF、MP3 等

拜托你别用 .text,不然你直接把文件当成文字解析,那就是灾难现场。

比如下载个图片:

withopen('cat.jpg', 'wb') as f:
    f.write(response.content)

这里一定要用 .content,因为你要原封不动地把文件写下来,像快递原箱送到你家。

有次我就犯了这个错,用 .text 写文件,还没运行完,Pillow 都出来砸我了:“你这图是我见过最离谱的!”

requests.text 的“阴谋”

有个实习生小哥搞个爬虫项目,写了个保存 PDF 的逻辑:

withopen('doc.pdf', 'w') as f:
    f.write(response.text)

我一看就知道出事了,但没说话。过了一会他抬头说:“哥,打开 PDF 全是乱码!”

我说:“你下次写代码要小心了,PDF 是你媳妇,你拿 .text 给她做了解码,相当于你非要猜她的心思,猜错了她就不理你了。”

他现在再也不敢随便用 .text 了,哪怕写封邮件都要先 .content 一下。

requests 到底咋猜编码的?

requests 默认用的是 response.apparent_encoding,这个是靠 chardet 模块猜的。你可以看它到底猜的是啥:

from requests import get

r = get('https://example.com')
print(r.apparent_encoding)

但说实话,这种“猜编码”的事,我一向不太信,毕竟程序员这职业已经够累的了,不想再当“情感分析师”。

所以我觉得:只要你能确定服务端用的编码,自己指定最靠谱。

最后,怎么判断我到底该用哪个?

这段逻辑,写爬虫的兄弟姐妹可以贴墙上:

使用场景
用哪个
原因说明
网页(HTML、文本)
text
自动解码为字符串,方便解析
下载文件(图片、PDF)
content
拿原始数据,保证数据完整
要自己做编码控制
content
 + .decode()
更灵活,自己掌握主动权

小结

这个问题看起来像是鸡毛蒜皮,但你真踩过坑,才知道它有多重要。

爬虫项目里,text 和 content 选错了,那可不是报个错就完事了,轻则乱码,重则写入错误文件,数据都白抓一场。

我一直觉得:requests 模块虽然简单,但它藏着不少细节,尤其是这种看似“相同”的属性背后,其实差得可大了——就像你以为女朋友说“随便”,真的是让你随便一样。

好了,说了这么多,兄弟们以后看到 .text 和 .content,别再选错了,要不然代码跑一半,调 bug 调到凌晨三点,估计你就知道这俩的区别有多现实了。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取