Python3中如何解决网页字符串编码问题:处理\xb6\xd4\xb6\xcc\xd0\xc5\格式的字节串
如图,我爬虫获取到的是一个 dict。现在我要把字典的中文解析出来。我用 py2 是这么干的:
主要是用了字符串的 decode。但是 py3 没有这个方法啊。
而且这个 dict 是用 requests 获取出来的 response.headers 获取出来就是字符串 dict,不能是 bytes。我自己试了用 bytes(s,"gbk"),str(s,"gbk")都没用。自己也想了几天,没啥结果。别跟我说在字符串前面加个 b 变为 bytes,问题是变量不能加 b 啊。

Python3中如何解决网页字符串编码问题:处理\xb6\xd4\xb6\xcc\xd0\xc5\格式的字节串
哈哈哈,我前段时间也遇到了,放弃了后来……
这个问题是典型的Python3中处理网页抓取时遇到的编码问题。你看到的\xb6\xd4\xb6\xcc\xd0\xc5\这种格式,其实是字节串(bytes)在控制台或日志中的显示形式,它表示的是使用某种编码(比如GBK)编码后的中文文本的原始字节。
核心原因在于:Python3中str和bytes严格区分。网页返回的原始数据是bytes,你需要用正确的编码将其解码(decode)为str。
解决方案:
-
首先,确定正确的编码。 对于中文网页,常见编码有
'utf-8'、'gbk'、'gb2312'。你可以通过以下方式获取或猜测:- 查看HTTP响应头中的
Content-Type,例如charset=utf-8。 - 查看网页HTML源码中的
<meta charset="...">标签。 - 使用
chardet库自动检测(非标准库,需安装pip install chardet)。
- 查看HTTP响应头中的
-
然后,进行解码。 使用
bytes对象的.decode()方法。
代码示例:
假设你通过 requests 库获取了一个网页,其内容字节串为 content_bytes。
import requests
# 假设你已获得字节串数据,例如:
# content_bytes = b'\xb6\xd4\xb6\xcc\xd0\xc5' # 这实际是“对信”的GBK编码
# 方法1:如果明确知道编码(例如GBK)
decoded_str = content_bytes.decode('gbk')
print(decoded_str) # 输出:对信
# 方法2:使用requests库,它会自动根据HTTP头部尝试解码
response = requests.get('你的网址')
# response.encoding 是requests推测的编码,response.text 是解码后的字符串
print(response.text)
# 方法3:使用chardet检测编码(当编码未知时)
try:
import chardet
encoding_detected = chardet.detect(content_bytes)['encoding']
if encoding_detected:
decoded_str = content_bytes.decode(encoding_detected)
print(decoded_str)
else:
print("无法检测编码")
except ImportError:
print("请先安装chardet库: pip install chardet")
关键点: 你遇到的字符串本质是 b'\xb6\xd4\xb6\xcc\xd0\xc5'(一个bytes对象),直接打印它就会显示成 \xb6\xd4\xb6\xcc\xd0\xc5。你需要做的就是找到对的编码(比如 'gbk'),然后调用 .decode('gbk') 得到正确的中文字符串。
总结: 用正确的编码对字节串进行 .decode() 即可。
data.encode(“raw_unicode_escape”)
“\xd3\xf1\xc1\xfa”.encode(“raw_unicode_escape”).decode(“gbk”)
Out[5]: ‘玉龙’
呃,我不是很懂 python
更像是 lz 那个是 dict 不知道怎么转 str 的问题
搜一下还是能找到解决方案。 没测试过中文文件名 lz 自己测试一下
r = requests.get(‘http://httpbin.org/image/jpeg’)
headers = str.encode(json.dumps(dict(r.headers)))
print(headers.decode(‘gbk’))
感谢各位大佬为我解惑。
既然是爬虫,
response = requests.get(url)
response.encoding="utf-8"
就直接是能看懂的汉字了,
那用这么麻烦…
print(str(b’\xb6\xd4\xb6\xcc\xd0\xc5’, encoding=“GBK”))
自己实现 http.client.parse_headers 方法
https://www.dust8.com/2017/12/04/header-parsing-error/
网络编程中常见的编码问题



)