python查网页源代码都是乱码怎么办
作者:娱乐 来源:综合 浏览: 【大 中 小】 发布时间:2026-10-17 06:05:27 评论数:
用Python抓网页,查网print出来全是页源乱码,这事我碰到过不下二十次。代码都乱别急着怀疑人生,码办九成情况是查网编码没对上。
先做个最直接的页源检查——看响应头里的charset。用requests库的代码都乱话,response.encoding这个属性经常是码办坑。网站返回的查网是UTF-8,但requests猜成了ISO-8859-1,页源你直接打印当然全乱。代码都乱这时候手动指定一下:response.encoding = 'utf-8',码办再打印就正常了。查网我上个月爬一个政府公告站,页源就是代码都乱这毛病,改一行代码的事。
但有时候响应头里没写charset,或者写了假的。那就得从HTML源码里找。正则搜charset=或者encoding=,看看meta标签里写的啥。有个老门户网站,响应头说是gb2312,实际页面里写的是gbk,按gb2312解照样乱。这时候用response.content.decode('gbk', errors='ignore'),直接拿字节流自己解码,别信requests的自动判断。
还有一种更阴间的——页面里嵌了iframe或者动态加载的内容。你requests拿到的只是空壳HTML,真正的内容是JS跑出来的,那些字符本身没乱,是你没拿到。这种情况别折腾编码了,换selenium或者playwright上,渲染完再抓。
再说个实战细节。有时候打印到终端乱,但存文件就正常,或者反过来。这跟Python没关系,是你终端和文件系统的编码不一致。Windows下cmd默认gbk,你print UTF-8的中文当然花屏。解决办法:要么sys.stdout.reconfigure(encoding='utf-8'),要么干脆把结果写进文件,用编辑器打开看。
最后提个土办法,但真管用。用chardet库自动检测编码,虽然慢点,但能处理绝大多数情况。写个兜底逻辑:先试UTF-8,不行就chardet猜,再不行就gbk硬解。这套组合拳打下来,我这两年没再被乱码卡住过。
对了,别忘了看是不是gzip压缩没解。requests会自动解,但如果你用了urllib或者自己拼的http请求,没解压的话,二进制流直接decode肯定乱。检查一下Content-Encoding响应头,是gzip就先gzip.decompress()。
乱码这事,本质就是编码和解码对不上。你手里拿的是字节流,得找对钥匙才能打开。别慌,按顺序排查:响应头 → HTML声明 → 自动检测 → 手动指定。基本上三步之内能解决。
