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)但说实话,这种“猜编码”的事,我一向不太信,毕竟程序员这职业已经够累的了,不想再当“情感分析师”。
所以我觉得:只要你能确定服务端用的编码,自己指定最靠谱。
最后,怎么判断我到底该用哪个?
这段逻辑,写爬虫的兄弟姐妹可以贴墙上:
text | ||
content | ||
content.decode() |
小结
这个问题看起来像是鸡毛蒜皮,但你真踩过坑,才知道它有多重要。
爬虫项目里,text 和 content 选错了,那可不是报个错就完事了,轻则乱码,重则写入错误文件,数据都白抓一场。
我一直觉得:requests 模块虽然简单,但它藏着不少细节,尤其是这种看似“相同”的属性背后,其实差得可大了——就像你以为女朋友说“随便”,真的是让你随便一样。
好了,说了这么多,兄弟们以后看到 .text 和 .content,别再选错了,要不然代码跑一半,调 bug 调到凌晨三点,估计你就知道这俩的区别有多现实了。
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。