requests.get()返回的response.text与浏览器显示不同,主因是网页主体由JavaScript动态渲染,requests仅获取初始HTML骨架;保存HTML乱码因编码未正确处理,应优先用response.content手动解码。

requests.get() 返回的 response.text 为什么和浏览器看到的不一样
多数情况不是你代码写错了,而是网页靠 JavaScript 渲染主体内容。比如新闻列表、商品卡片、评论区——这些常由 fetch() 或 axios 异步加载,requests 只拿到初始 HTML,里面只有骨架或 loading 占位符。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 先打开浏览器开发者工具 → Network 标签页 → 刷新页面 → 筛选
HTML类型请求,点开看 Preview 或 Response:如果正文已存在,requests就够用;如果为空或只有 script 标签,说明得换方案 - 若目标是 AJAX 接口返回的 JSON 数据,直接抓那个 XHR 请求的 URL,用
requests.get()调它,比跑整个页面快得多也稳得多 - 真要等 JS 执行(比如单页应用 SPA),用
selenium或playwright,但注意它们启动慢、内存高、容易被反爬识别,别无必要时别上
保存 HTML 源码时乱码或报 UnicodeEncodeError
根本原因是编码链断裂:服务器响应头没写 Content-Type: text/html; charset=utf-8,或者写了但错了;requests 默认按响应头解码,结果 fallback 成 ISO-8859-1,一读中文就崩。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 别碰
response.text,直接用response.content(原始字节)手动解码:html = response.content.decode('utf-8', errors='ignore') - 想自动探测编码,装
chardet:import chardetencoding = chardet.detect(response.content)['encoding'] or 'utf-8'html = response.content.decode(encoding, errors='replace') - 写文件时必须显式指定
encoding='utf-8':with open('page.html', 'w', encoding='utf-8') as f:f.write(html),否则 Windows 默认用cp1252,中文直接报错
用 BeautifulSoup 解析后再保存,结果打开没样式也没脚本
因为 BeautifulSoup 默认只保留“语义有效”的结构,<script>、<style>、HTML 注释、空格缩进全被剥离或重排,本地双击打开后功能异常、样式错乱、甚至空白。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 如果目标是「完整保存原始 HTML」,压根别过
BeautifulSoup——直接存response.content或修复编码后的html字符串 - 非要用 BS 处理再保存(比如删广告 div、提取正文区域),初始化时加参数:
soup = BeautifulSoup(html, 'html.parser', parse_only=...)或用preserve_whitespace=True(需 lxml 解析器) - 更稳妥的做法:用
soup.prettify()替代直接str(soup),至少能保持基础格式可读性
快速提取正文文本,又不想引入 heavy 工具
如果你只需要纯文本(比如做摘要、NLP 输入),不关心 HTML 结构,BeautifulSoup + .get_text() 是最轻量可靠的组合;比正则安全,比 selenium 快十倍。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 安装:
pip install requests beautifulsoup4 - 基本用法:
soup = BeautifulSoup(response.content, 'html.parser')text = soup.body.get_text(separator='\n', strip=True) if soup.body else soup.get_text(separator='\n', strip=True) - 注意
soup.body可能为None(比如 malformed HTML),所以要做 fallback - 如需保留段落逻辑,
separator='\n'比空格更合理;strip=True自动去首尾空白,避免开头一堆 \n
真正容易被忽略的是:**“保存 HTML” 和 “提取正文” 是两件目的完全不同的事**。前者要求字节级保真,后者追求语义清洗。混用解析器、跳过编码校验、盲目信任 response.text,是绝大多数人第一次写爬虫就栽跟头的地方。



















