Mr hu 生命漫长而短暂。 浅析requests库响应对象的text和content属性

在做爬虫时请求网页的requests库是必不可少的,我们常常会用到 res = resquests.get(url) 方法,在获取网页的html代码时常常使用res的text属性: html = res.text,在下载图片或文件时常常使用res的content属性: 复制代码 with open(filename, 'wb') as fp:   fp.write(res.content) 复制代码 下面我们来看看 'text' 和 'content' 的不同之处: 输出本博客的响应对象的 text 复制代码 import requests url = 'https://www.cnblogs.com/huwt/' res = requests.get(url, timeout = 6) print(res.text) 复制代码 (只截取到标签) 输出本博客的响应对象的 content 复制代码 import requests url = 'https://www.cnblogs.com/huwt/' res = requests.get(url, timeout = 6) print(res.content) 复制代码 (只截取到<title>标签) 通过<title>标签我们可以看出 res.text 直接输出了汉字,而 res.content 好像是以十六进制的形式来表示汉字 为了让进一步了解text 和 content 我们来看看它们的类型: 复制代码 import requests url = 'https://www.cnblogs.com/huwt/' res = requests.get(url, timeout = 6) print(type(res.text)) print(type(res.content)) 复制代码 我们可以看到res.text是字符串类型,而res.content是二进制类型 为了进一步验证我们使用bytes类型的decode()方法对content进行‘utf-8’编码再显示 复制代码 import requests url = 'https://www.cnblogs.com/huwt/' res = requests.get(url, timeout = 6) print(res.content.decode('utf-8')) 复制代码 发现和res.text显示的内容完全一样 因此我们可以得出结论: 复制代码 resp.text返回的是Unicode型的数据。 resp.content返回的是bytes型也就是二进制的数据。、 获取文本一般使用res.text, 获取图片或文件一般使用res.conten 复制代码 再做几点补充: 复制代码 text是content经过编码之后的字符串,那编码方式是什么呢? 在返回text时requests会基于 HTTP 头部对响应的编码作出有根据的推测,但不一定准确,有可能出现乱码, 而我们可以手动指定一种编码方式:res.encoding = '需要的编码方式' 或让requests根据body进行猜测:res.encoding = res.apparent_encoding 复制代码 参考学习: https://zhidao.baidu.com/question/941417472703558372.html https://www.cnblogs.com/loveyouyou616/p/8135678.html https://www.cnblogs.com/chownjy/p/6625299.html https://www.jianshu.com/p/0e0336b370f3 那年你走的时候,思念缠绕我心头, 踏遍远方的山丘,你无悔的追求, 我愿为春风去守候,你握着我的手。https://www.cnblogs.com/huwt/p/10368803.html </div> <div class="article-tags"> <div class="tags-label">关键字:</div> <div class="tag-list"> </div> </div> </div> </div> <!-- 侧边栏 --> <div class="col-lg-4"> <!-- 热门资讯 --> <div class="sidebar"> <h4 class="sidebar-title"><a href="/">青岛软件培训</a></h4> <div class="hot-news-item" onclick="location.href=news-detail.html?id=2"> <p class="card-text"> 可能你正在寻找一家靠谱的IT培训机构, 渴望突破职业瓶颈, 找一份得体的工作。 恰巧万码学堂正在寻找像你这样不甘平凡的追光者! 我们拒绝纸上谈兵,直接参与真实开发流程!<br> <b>现在行动,未来可期</b>‌<br> 立即拨打<a href="tel:0532-85025005">0532-85025005</a>,预约免费职业规划咨询 前20名咨询者赠送《2025高薪技术岗位白皮书》!<br> <b>你不是在报名课程,而是在投资五年后的自己!</b> </p> <a href="http://www.qingruanit.net/c_online/p_yudingshitingke.html" target="_blank" class="btn btn-primary">申请免费试听课程</a> </div> </div> </div> </div> </div> </section> <!-- 数据统计 --> <section class="stats-section"> <div class="container"> <div class="row"> <div class="col-lg-3 col-md-6 mb-4"> <div class="stat-item"> <span class="stat-number">50000+</span> <div class="stat-label">5万行代码练就真实本领</div> </div> </div> <div class="col-lg-3 col-md-6 mb-4"> <div class="stat-item"> <span class="stat-number">17年</span> <div class="stat-label">创办于2008年老牌培训机构</div> </div> </div> <div class="col-lg-3 col-md-6 mb-4"> <div class="stat-item"> <span class="stat-number">1000+</span> <div class="stat-label">合作企业</div> </div> </div> <div class="col-lg-3 col-md-6 mb-4"> <div class="stat-item"> <span class="stat-number">98%</span> <div class="stat-label">就业率</div> </div> </div> </div> </div> </section> <!-- 联系我们 --> <section id="contact" class="py-5"> <div class="container"> <h2 class="section-title">联系我们</h2> <div class="row justify-content-center"> <div class="col-lg-8"> <div class="row"> <div class="col-md-6 mb-4"> <div class="text-center"> <i class="fas fa-phone feature-icon"></i> <h4>电话咨询</h4> <p class="feature-text">0532-85025005</p> </div> </div> <div class="col-md-6 mb-4"> <div class="text-center"> <i class="fas fa-envelope feature-icon"></i> <h4>扫码添加微信</h4> <p class="feature-text"> <a href="https://work.weixin.qq.com/kfid/kfc5d203e0a7d2f3da5" target="_blank"><img src="https://www.wanmait.com/static/images/weixin.png"></a> </p> </div> </div> </div> </div> </div> </div> </section> <!-- 友情链接 --> <!-- <section class="friends-links"> <div class="container"> <h3 class="friends-links-title">友情链接</h3> <div class="friends-links-container"> <a href="#" target="_blank">腾讯课堂</a> </div> </div> </section> --> <!-- 页脚 --> <footer class="footer"> <div class="container"> <div class="row"> <div class="col-lg-6"> <h5 class="footer-title">万码学堂</h5> <p class="footer-text"><a href="http://www.ruanjianpeixun.net">青岛软件培训</a></p> </div> <div class="col-lg-6"> <h5 class="footer-title">选择一家好的青岛软件培训学校,就要看教学质量和口碑</h5> </div> </div> <hr class="my-4" style="border-color: #34495e;"> <div class="row"> <div class="col-12 text-center"> <p class="footer-text mb-0">万码学堂-做最负责任的教育-联系电话0532-85025005<p><a href="https://beian.miit.gov.cn/" target="_blank">鲁ICP备09077726号-3</a></p></p> </div> </div> </div> <script src="https://www.wanmait.com/online/wmonline.js?site=3"></script> </footer> </body> </html> <!-- JavaScript --> <script src="/bootstrap/js/jquery-3.6.0.min.js"></script> <script src="/bootstrap/js/bootstrap.bundle.min.js"></script> <script> // 确保导航栏功能正常工作 document.addEventListener("DOMContentLoaded", function() { // 手动初始化Bootstrap的Collapse组件 const navbarToggler = document.querySelector(".navbar-toggler"); const navbarCollapse = document.querySelector(".navbar-collapse"); if (navbarToggler && navbarCollapse) { navbarToggler.addEventListener("click", function(e) { e.preventDefault(); navbarCollapse.classList.toggle("show"); // 更新aria-expanded属性 const isExpanded = navbarCollapse.classList.contains("show"); navbarToggler.setAttribute("aria-expanded", isExpanded); }); } // 导航栏滚动效果 window.addEventListener("scroll", function() { const navbar = document.querySelector(".navbar"); if (window.scrollY > 50) { navbar.style.background = "rgba(255, 255, 255, 0.95)"; navbar.style.backdropFilter = "blur(10px)"; } else { navbar.style.background = "#ffffff"; navbar.style.backdropFilter = "none"; } }); // 数字动画效果 function animateNumbers() { const statNumbers = document.querySelectorAll(".stat-number"); statNumbers.forEach(stat => { const target = parseInt(stat.textContent.replace(/[^\d]/g, "")); const suffix = stat.textContent.replace(/[\d]/g, ""); let current = 0; const increment = target / 50; const timer = setInterval(() => { current += increment; if (current >= target) { current = target; clearInterval(timer); } stat.textContent = Math.floor(current) + suffix; }, 30); }); } // 当统计区域进入视口时触发动画 const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { animateNumbers(); observer.unobserve(entry.target); } }); }); const statsSection = document.querySelector(".stats-section"); if (statsSection) { observer.observe(statsSection); } }); </script>