Python使用request.get函数,返回的网页内容为UNCOIDE编码,中文出现乱码解决方案

本文详细解析了在Python中使用request.get函数获取网页内容时遇到的中文乱码问题,并提供了解决方案。通过理解Unicode-escape格式及decode函数的正确使用,可以成功将乱码转换为正常显示的中文。

Python使用request.get函数,返回的网页内容为UNCOIDE编码,中文出现乱码解决方案

问题描述:

解决这个问题,首先确保你的编辑器,运行环境中,'中文’这样的字符串是能够打印出来的。(我所使用的VScode自带OUTPUT,会产生中文乱码。所以我改为直接用Terminal来运行Python。)接着,如果还疑惑request得到的内容还是中文乱码,请继续看下去!

通过request.get访问网站,网站返回的是Unicode-escape格式的字节流。
例:

r = b'{"code": 1, "proxies": [{"https": "0.0.0.0:8008",
 "\\u6700\\u540e\\u9a8c\\u8bc1\\u65f6\\u95f4": "2019-10-23 09:14:15",
 "\\u9a8c\\u8bc1\\u6b21\\u6570": 1, "\\u7c7b\\u578b": "\\u9ad8\\u533f"}]}'

如何将其变回为中文呢?

解决方法:
r.decode("unicode-escape")
解答:

'b\\u9ad8'(高)字来说:
我们从网站上通过requests.get(url).content得到的是bytes字节流对象。
->b'\\u9ad8'
b'\\u9ad8'其实是unicode-escape格式的字节流,表示的是"高"字(和常见的unicode格式'\u9ad8'是不同之处在于它用\\u来标记为unicode编码,而unicode格式用\u标记为unicode编码)。
我们用decode(“unicode-escape”)对其进行解码,它就能理解为是汉字了。

思考

我个人觉得\\\是不同的环境中的影响。可能不是上面我所说的内容。但有了更准确地理解,我会第一时间更新博客的。解决方法肯定是对的,读者尽管放心,若有指点,不胜荣幸!

补充:
1. encode函数和decode函数
  • encode作用将当前字符串按指定格式编码为bytes字节流。
  • decode作用将字节流按指定格式解码为字符串。
  • str对象是没有decode的,bytes对象才有decode

比如:

r = "中文"
print(r, type(r)) # "中文" <class 'str'>
r= r.encode("utf-8")
print(r, type(r)) # b'\xe4\xb8\xad\xe6\x96\x87'  <class 'bytes'>
r = r.decode("gb2312")
print(r, type(r)) # "中文" <class 'str'>
2. Python运行时将字符串转为Unicode格式
  • Python3中输入输出不管是什么格式,中间转接的都是Unicode格式。
    比如输入是汉字,python内部的过程是 ‘请’→'\u8bf7'→’请’

你如果在Python中print('\u8bf7'),得到的就是’请’字,可知Python能直接识别你的字符串中Unciode格式的内容。

3. 编码
  • \x是16进制,后面跟两位,表示单字节编码。
  • \u是unicode码,后面跟4个16进制数。
3. 这一问题我刚开始的想法

我们从网站得到的字符串是"\\u6700"(误),转义符\\转义了,就不能用\u来表示unicode格式了,所以只能识别为一个普通的字符串(实际上这是unicode-escape格式)。你对其encode("utf-8")得到的是b'\\u6700'

  • '\u8bf7'(python直接识别为’请’) -> 经过encode('utf-8')后 -> b'\xe8\xaf\xb7'(此过程将unicode格式的字符串转为utf-8格式的字节流)
  • '\\u8bf7' -> 经过encode('utf-8')后 -> b'\\u8bf7'(此过程将一个普通的字符串同样转为utf-8格式的字节流)

参考
https://www.kawabangga.com/posts/2767

<think>我们正在讨论的是如何在Django后台获取axios.get请求传递的参数。 根据引用[3],axios.get请求传递参数是通过params对象传递的,例如: axios.get("/get", { params: { id: 20, name: '阿狸' } }) 在Django中,GET请求的参数是通过request对象的GET属性(一个QueryDict)获取的。 例如,对于上述请求,在Django视图函数中可以这样获取: id = request.GET.get('id') # 得到字符串'20' name = request.GET.get('name') # 得到字符串'阿狸' 注意:axios.get请求的参数会以查询字符串的形式附加在URL后面,例如:/get?id=20&name=阿狸 因此,在Django中获取这些参数与获取普通GET请求参数的方式完全一致。 下面是一个完整的示例: 前端(使用axios): axios.get('/api/data/', { params: { page: 1, size: 10 } }) .then(response => { ... }) .catch(error => { ... }); 后端(Django视图): from django.http import JsonResponse def get_data(request): # 获取参数,注意:得到的都是字符串,需要转换类型 page = request.GET.get('page', '1') # 默认值'1' size = request.GET.get('size', '10') # 默认值'10' # 转换为整数 try: page = int(page) size = int(size) except ValueError: # 处理错误 return JsonResponse({'error': 'Invalid parameter'}, status=400) # 然后使用page和size进行数据库查询等操作 # ... return JsonResponse({'data': [...]}) 另外,如果参数中有中文字符,axios会自动进行URL编码,Django的request.GET会自动解码,所以可以直接获取。 注意:如果参数是数组,例如: axios.get('/api/data/', { params: { ids: [1, 2, 3] } }); 那么URL会变成:/api/data/?ids[]=1&ids[]=2&ids[]=3 或者 /api/data/?ids=1&ids=2&ids=3(取决于axios配置,默认是后者) 在Django中,可以使用getlist方法获取同一个参数名的多个值: ids = request.GET.getlist('ids') # 得到['1','2','3'] 然后转换为整数列表: ids = [int(id) for id in ids] 但是注意,如果数组很大,URL可能会超过长度限制,此时建议使用POST请求。 总结:在Django中获取axios.get传递的参数,直接使用request.GET.get()或request.GET.getlist()即可。 相关问题: 1. 如何在Django中获取POST请求的JSON数据? 2. 如何处理axios发送的数组参数? 3. Django中如何获取请求头信息? 4. 如何防止Django中的参数类型转换错误? 5. 如何验证请求参数的合法性? </think>### Python获取axios.get传递参数的方法 在Django后端获取axios.get()传递的参数,主要通过解析URL查询字符串实现。以下是具体方法和注意事项: #### 1. **基本获取方式** ```python # Django视图函数示例 from django.http import JsonResponse def get_params(request): # 获取单个参数值(字符串类型) id = request.GET.get('id') # 获取id参数 # 获取多个相同参数名的值(如ids=1&ids=2) ids = request.GET.getlist('ids') # 带默认值的获取 name = request.GET.get('name', 'default_name') return JsonResponse({'id': id, 'name': name}) ``` #### 2. **参数类型处理** axios默认将参数转为字符串,需要手动转换类型: ```python from django.views.decorators.csrf import csrf_exempt @csrf_exempt def process_data(request): # 数字类型转换 page = int(request.GET.get('page', 1)) # 布尔类型转换 active = request.GET.get('active', 'false').lower() == 'true' # 数组类型(逗号分隔的值) categories = request.GET.get('categories', '').split(',') return JsonResponse({'page': page, 'active': active}) ``` #### 3. **axios.get前端调用示例** ```javascript // 前端调用示例(参考引用[1]和引用[3]) axios.get('/api/data/', { params: { id: 20, // 数字参数 name: '张三', // 中文参数 active: true, // 布尔值 categories: [1, 5, 8] // 数组 } }).then(response => { console.log(response.data); }); ``` #### 4. **特殊字符处理** 当中文或特殊字符出现乱码时: ```python # urls.py 配置UTF-8路由 re_path(r'^api/data/$', views.get_params) # 确保支持Unicode # 视图层解码 from urllib.parse import unquote name = unquote(request.GET.get('name')) ``` #### 5. **完整工作流程** 1. **axios请求** → `GET /api/data/?id=20&name=张三&active=true&categories=1,5,8` 2. **Django路由**: ```python # urls.py from . import views urlpatterns = [ path('api/data/', views.get_params), ] ``` 3. **参数获取结果**: ```python { 'id': "20", # 字符串 'name': "张三", # 解码后中文 'active': True, # 转换后的布尔值 'categories': ['1','5','8'] } ``` ### 常见问题解决 1. **参数获取为None**: - 检查axios的URL是否包含参数 - 验证Django路由是否匹配 - 使用Chrome开发者工具查看Network标签中的实际请求URL 2. **中文乱码**: - 前端使用`encodeURIComponent()`处理中文参数 ```javascript params: { name: encodeURIComponent('张三') } ``` - 后端使用`unquote()`解码 3. **数组参数处理**: - axios默认将数组转为`arr[]=1&arr[]=2`格式 - Django需使用`request.GET.getlist('arr[]')`获取 4. **嵌套对象参数**: 需要手动序列化: ```javascript // 前端 params: { filter: JSON.stringify({ min: 5, max: 20 }) } // 后端 import json filter_data = json.loads(request.GET.get('filter')) ``` ### 相关问题 1. 如何获取axios.post()发送的JSON数据?[^2] 2. Django如何处理包含文件上传的混合请求? 3. axios配置超时和错误处理的最佳实践?[^1] 4. 如何验证axios传递参数的合法性? 5. Django REST Framework中获取GET参数的不同方式? [^1]: axios支持多种请求方式:`axios(config)` `axios.get(url[,config])`等,需正确配置params参数 [^2]: Flask接收axios post数据的方式与Django不同,需使用`request.get_json()` [^3]: axios get请求参数需通过params对象传递,Django通过URL查询字符串获取
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值