Python使用requests.get获取ngrok返回的原始内容为何不可读?
解决Python 3.6中requests GET响应原始内容读取问题
嘿,我之前也碰到过类似的乱码问题,咱们一步步拆解排查~
先搞清楚核心问题:响应编码与内容类型不匹配
你提到POST请求源是application/json且编码为utf-8,但你当前处理的是GET响应,服务器返回的响应头、编码可能和你预期的不一样,这往往是乱码的根源。
第一步:先确认响应的真实状态
先别着急解析,先把响应的头信息和当前编码打出来,看看服务器实际返回了什么:
import requests # 替换成你的ngrok转发URL response = requests.get("https://xxxxx.ngrok.io") # 打印响应头,重点看Content-Type字段 print("响应头信息:", response.headers) # 打印requests自动识别的编码 print("当前识别的编码:", response.encoding)
很多时候服务器没在响应头里正确设置charset=utf-8,导致requests默认用了ISO-8859-1这类编码去解析,自然会出现乱码。
第二步:强制指定编码解析
如果响应头里的编码不对,或者压根没指定,直接手动设置编码为utf-8再读取:
response.encoding = 'utf-8' readable_content = response.text print("解析后的内容:", readable_content)
要是还是乱码,可能是服务器返回了压缩内容(比如gzip),试试关闭自动解压后再处理:
# 告诉服务器不要返回压缩内容 headers = {'Accept-Encoding': 'identity'} response = requests.get("你的ngrok URL", headers=headers) response.encoding = 'utf-8' print(response.text)
第三步:直接处理原始二进制内容
如果上面的方法都不行,那就直接读取原始二进制数据,手动解码:
raw_bin = response.content # 用utf-8解码,要是报错可以试试gbk/utf-16等常见编码 try: decoded_content = raw_bin.decode('utf-8') print(decoded_content) except UnicodeDecodeError: # 试试自动检测编码(需要先安装chardet:pip install chardet) import chardet detect_result = chardet.detect(raw_bin) print(f"自动检测到编码:{detect_result['encoding']}") decoded_content = raw_bin.decode(detect_result['encoding']) print(decoded_content)
第四步:排除ngrok的转发影响
有时候ngrok在转发过程中会修改响应头或编码,你可以用curl命令直接测试,对比和Python里拿到的结果是否一致:
curl -v "你的ngrok转发URL"
如果curl返回的内容是正常的,那问题大概率出在Python代码的处理逻辑上;如果curl也乱码,那可能是源服务器的响应本身有问题。
另外,你提到之前用urllib试过,要是能把那段代码贴出来,说不定能更快找到细节问题~
内容的提问来源于stack exchange,提问作者IDontKnowCode
相关产品推荐
相关产品推荐

