如何用Python解压JSON中Base64编码的压缩数据?
解决Selenium Grid文件下载的JSON封装压缩内容解析问题
在使用Selenium Grid做自动化测试时,文件下载的响应不会直接返回文件本身,而是把内容压缩后封装进JSON结构里。你拿到的响应数据如下:
b'{
"filename": "test.txt",
"contents": "UEsDBBQACAgIAFV1TlYAAAAAAAAAAAAAAAAIAAAAdGVzdC50eHQDAFBLBwgAAAAAAgAAAAAAAABQSwECFAAUAAgICABVdU5WAAAAAAIAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAdGVzdC50eHRQSwUGAAAAAAEAAQA2AAAAOAAAAAAA"
}'
根据Selenium Grid官方文档说明:通过Grid下载文件时,文件内容会先被压缩为ZIP格式,再做Base64编码,最终封装到包含filename(原始文件名)和contents(Base64编码的ZIP数据)的JSON对象中返回。
以下是Python实现解析的步骤及代码:
处理流程
- 将字节格式的响应数据转成字符串,再解析为JSON对象
- 提取
contents字段的Base64编码字符串,解码得到字节形式的ZIP压缩数据 - 读取ZIP数据,提取目标文件的内容
完整代码示例
import json import base64 from zipfile import ZipFile from io import BytesIO # 从Selenium Grid获取的响应字节数据 response_bytes = b'{ "filename": "test.txt", "contents": "UEsDBBQACAgIAFV1TlYAAAAAAAAAAAAAAAAIAAAAdGVzdC50eHQDAFBLBwgAAAAAAgAAAAAAAABQSwECFAAUAAgICABVdU5WAAAAAAIAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAdGVzdC50eHRQSwUGAAAAAAEAAQA2AAAAOAAAAAAA"}' # 1. 解析JSON响应 response_data = json.loads(response_bytes.decode('utf-8')) contents_b64 = response_data['contents'] target_filename = response_data['filename'] # 2. Base64解码得到ZIP字节数据 zip_bytes = base64.b64decode(contents_b64) # 3. 读取ZIP并提取目标文件内容 with ZipFile(BytesIO(zip_bytes)) as zip_file: if target_filename in zip_file.namelist(): with zip_file.open(target_filename) as file: file_content = file.read().decode('utf-8') print(f"文件{target_filename}内容:") print(file_content) else: print(f"ZIP中未找到文件{target_filename}")
说明:代码用BytesIO把解码后的ZIP字节数据转为类文件对象,再通过zipfile.ZipFile读取内部文件。你的测试场景里test.txt是空文件,最终输出为空字符串。
内容的提问来源于stack exchange,提问作者Ryan Nygard
相关产品推荐
相关产品推荐

