Python中Requests库加入headers后出现'latin-1'编码错误如何解决
如果不加 requests.get() 中不加 headers = headers,一切运行正常。
加入 headers = headers 后出现如下编码错误,谷歌好久没找到答案。
UnicodeEncodeError: 'latin-1' codec can't encode character '\u2026' in position 29: ordinal not in range(256)
https://gist.github.com/anonymous/5675cf38b29cb522452024ae92c33097
Python中Requests库加入headers后出现'latin-1'编码错误如何解决
遇到 'latin-1' 编码错误,通常是因为请求头(headers)或请求体(data)里包含了非ASCII字符(比如中文),而Requests库在准备请求时,默认尝试用 'latin-1' 编码这些字符串,但 'latin-1' 字符集不支持这些字符,于是就报错了。
核心原因:Requests库在构建最终要发送的原始HTTP请求时,会调用 str.encode() 方法。如果你的headers字典里的值(比如 User-Agent 或自定义头)是Python的 str 类型(即Unicode字符串),并且包含了非 'latin-1' 字符,就会触发这个错误。
解决方案很简单:确保你的headers值全部是字节串(bytes)或纯ASCII字符串。
具体做法:
-
检查并清理headers:仔细看你设置的headers字典,特别是
User-Agent、Referer或者任何自定义的头部字段。确保它们的值不包含中文、特殊符号等非ASCII字符。如果必须有,就把它手动编码成字节串。 -
将非ASCII字符串显式编码为UTF-8字节串:这是最直接有效的方法。找到那个包含非ASCII字符的header值,用
.encode('utf-8')把它转成bytes再传给Requests。
代码示例:
假设你的错误是因为一个自定义头 X-Custom-Header 的值包含了中文:
import requests
url = 'https://httpbin.org/post'
# 错误的做法:直接使用包含中文的Unicode字符串
# headers = {'X-Custom-Header': '这是一个中文值'}
# 正确的做法:将值编码为UTF-8字节串
headers = {
'User-Agent': 'MyApp/1.0', # 纯ASCII,没问题
'X-Custom-Header': '这是一个中文值'.encode('utf-8') # 关键在这里!
}
data = {'key': 'value'}
response = requests.post(url, headers=headers, data=data)
print(response.status_code)
如果问题出在请求体(data 或 json 参数),解决思路一样:确保你传递的字典里的字符串值都是ASCII或字节串。对于 json 参数,Requests会帮你编码,通常不会有这个问题,除非你的字典键包含了非ASCII字符。
一句话总结:把headers里带非ASCII字符的值用 .encode('utf-8') 转成字节串就能解决。
headers = {‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel … Gecko/20100101 Firefox/54.0’}
…
这个中文的字符是什么鬼
文件头部加上
# -- coding: utf-8 --
……你可以编码
header 的 dict 中应该有中文,我也忘了是 string 前面加个 u 还是.encoding(‘utf-8’)
😅 确实是 Intel … 的问题,我一直诧异这三个点是什么意思。
刚细细看了些原来是省略,把它展开后就可以了 😄
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:54.0) Gecko/20100101 Firefox/54.0

