当前位置: 首页 > news >正文

【Python】requests的response.text 和 urllib.request 的 response.read()的区别

刚写代码的时候,我经常会把requests 和 urllib下的request 包搞混,这两个请求响应的方法看起来很相似,但是写获取的方法是不一样的。

前者requests 是用response.text 来获取源码,而 urllib.request是用 response.read() 来获取html内容的,他们返回的响应内容也不一样,获取响应的状态码也会不一样。

如果搞混读取的方法,可能就会出现:【‘Response’ object has no attribute ‘read’】的问题:
在这里插入图片描述或者状态值获取不对时出现【‘Response’ object has no attribute ‘status’】的问题:在这里插入图片描述

具体的区别:

1. response.text

在Python的requests库中,它的使用示例如下:

# 使用response.text读取文本内容
import requests# 发送GET请求
response = requests.get('https://example.com')text_content = response.text
print('获取响应状态:',response.status_code)
print(type(text_content)) #str
print(text_content)#==============结果:==================================
<!doctype html>
<html>
<head><title>Example Domain</title><meta charset="utf-8" /><meta http-equiv="Content-type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><style type="text/css">body {background-color: #f0f0f2;margin: 0;padding: 0;font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;}div {width: 600px;margin: 5em auto;padding: 2em;background-color: #fdfdff;border-radius: 0.5em;box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);}a:link, a:visited {color: #38488f;text-decoration: none;}@media (max-width: 700px) {div {margin: 0 auto;width: auto;}}</style>    
</head><body>
<div><h1>Example Domain</h1><p>This domain is for use in illustrative examples in documents. You may use thisdomain in literature without prior coordination or asking for permission.</p><p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

requests库的response.text的特点:

  • 返回内容:返回的是解码后的【Unicode字符串】,str
  • 解码方法:它自动解码响应体,通常是使用响应头中的Content-Type和charset参数,自动选择合适的编码来解码响应内容。
  • 适用场景:这个方法通常用于读取文本内容,如HTML、JSON或XML。

2. response.read()

urllib.request模块的response.read()的特点:

  • 返回内容:返回响应体的【原始字节串】, bytes。
  • 解码方法:不进行任何解码,直接返回二进制数据。
  • 适用场景:它常用于读取非文本内容,如图片、视频或二进制文件。

它的使用示例如下:

# 使用response.read()读取原始字节数据
from urllib.request import urlopenresponse=urlopen('https://example.com')
print('获取响应状态:',response.status)
binary_content = response.read()
print(type(binary_content)) #<class 'bytes'>
print(binary_content)
#==============结果:==================================
b'<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset="utf-8" />\n    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n    <meta name="viewport" content="width=device-width, initial-scale=1" />\n    <style type="text/css">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;\n        \n    }\n    div {\n        width: 600px;\n        margin: 5em auto;\n        padding: 2em;\n        background-color: #fdfdff;\n        border-radius: 0.5em;\n        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n    }\n    a:link, a:visited {\n        color: #38488f;\n        text-decoration: none;\n    }\n    @media (max-width: 700px) {\n        div {\n            margin: 0 auto;\n            width: auto;\n        }\n    }\n    </style>    \n</head>\n\n<body>\n<div>\n    <h1>Example Domain</h1>\n    <p>This domain is for use in illustrative examples in documents. You may use this\n    domain in literature without prior coordination or asking for permission.</p>\n    <p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'

3.主要区别

  1. 解码:requests的response.text自动解码,而urllib.request的response.read()返回原始字节数据。

  2. 获取响应状态的方式:requests的是用status_code,而urllib.request的是status

  3. 易用性:requests提供了更高级的接口和更多的便利功能,如会话管理、Cookie持久化等; 而urllib.request提供了更多的控制和灵活性,但使用起来可能更复杂。

  4. 库的依赖:requests不是Python标准库的一部分,需要单独安装,通常被认为是更高级、更易用的HTTP库;而urllib.request是Python标准库的一部分,无需额外安装。

  5. 处理结果上:response.text可以直接对返回的字符串进行操作,比如解析JSON或HTML;
    而使用response.read()时,可能需要先将二进制数据转换为适当的格式,比如使用BytesIO来处理二进制数据,或者将其解码为字符串才能使用!

总之,我们在使用的过程中,大家要注意两者不要搞混了哈~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 编程-设计模式 26:业务代表模式
  • Android11 关于三方应用获取su权限
  • 以Zed项目为例学习大型Rust项目的组织与管理
  • 数据结构----二叉树
  • Cairo库移植到安卓记录
  • 【登录扫码】--集成企业微信
  • todoList清单(HTML+CSS+JavaScript)
  • Linux中apache服务安装与mysql安装
  • git强制推送代码教程
  • 如何使用css写三角形
  • 操作系统(进程通信)
  • Spring 中的InitializingBean
  • C语言实现数据结构之队列
  • 基于GeoTools使用JavaFx进行矢量数据可视化实战
  • NoSQL之Redis配置与优化
  • 收藏网友的 源程序下载网
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android单元测试 - 几个重要问题
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • CSS实用技巧干货
  • echarts的各种常用效果展示
  • es的写入过程
  • extract-text-webpack-plugin用法
  • mac修复ab及siege安装
  • Python_网络编程
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue.js框架原理浅析
  • 对象管理器(defineProperty)学习笔记
  • 分布式熔断降级平台aegis
  • 构造函数(constructor)与原型链(prototype)关系
  • 官方解决所有 npm 全局安装权限问题
  • 汉诺塔算法
  • 码农张的Bug人生 - 初来乍到
  • 设计模式 开闭原则
  • 深入 Nginx 之配置篇
  • 使用 Docker 部署 Spring Boot项目
  • 手写一个CommonJS打包工具(一)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 一些css基础学习笔记
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 阿里云API、SDK和CLI应用实践方案
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 达梦数据库知识点
  • (04)odoo视图操作
  • (C++17) std算法之执行策略 execution
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Qt) 默认QtWidget应用包含什么?
  • (二)springcloud实战之config配置中心
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (简单) HDU 2612 Find a way,BFS。
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (四)事件系统
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功