赞
踩
刚写代码的时候,我经常会把requests 和 urllib下的request 包搞混,这两个请求响应的方法看起来很相似,但是写获取的方法是不一样的。
前者requests 是用response.text
来获取源码,而 urllib.request是用 response.read()
来获取html内容的,他们返回的响应内容也不一样,获取响应的状态码也会不一样。
如果搞混读取的方法,可能就会出现:【‘Response’ object has no attribute ‘read’】的问题:
或者状态值获取不对时出现【‘Response’ object has no attribute ‘status’】的问题:
具体的区别:
在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 this domain 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的特点:
Content-Type
和charset参数,自动选择合适的编码来解码响应内容。urllib.request
模块的response.read()的特点:
它的使用示例如下:
# 使用response.read()读取原始字节数据
from urllib.request import urlopen
response=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'
解码:requests
的response.text自动解码,而urllib.request
的response.read()返回原始字节数据。
获取响应状态的方式:requests
的是用status_code,而urllib.request
的是status
易用性:requests
提供了更高级的接口和更多的便利功能,如会话管理、Cookie持久化等; 而urllib.request
提供了更多的控制和灵活性,但使用起来可能更复杂。
库的依赖:requests
不是Python标准库的一部分,需要单独安装,通常被认为是更高级、更易用的HTTP库;而urllib.request
是Python标准库的一部分,无需额外安装。
处理结果上:response.text
可以直接对返回的字符串进行操作,比如解析JSON或HTML;
而使用response.read()
时,可能需要先将二进制数据转换为适当的格式,比如使用BytesIO
来处理二进制数据,或者将其解码为字符串才能使用!
总之,我们在使用的过程中,大家要注意两者不要搞混了哈~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。