如何在Python中访问Chrome性能日志的嵌套字典?
处理Chrome性能日志时解析嵌套字段的问题与优化建议
问题背景
在Python中处理Chrome性能日志时,需要访问日志嵌套结构里的method和params字段。最初直接通过message['method']访问时触发TypeError: string indices must be integers,原因是log["message"]实际是JSON字符串而非字典结构。通过json.loads解析字符串后已成功获取目标数据,但不确定当前方案是否最优,寻求技术优化指导。
原尝试代码
def new_file_log(self): # Chrome log logs = self.driver.get_log("performance") for log in logs: message = log["message"] if 'Network.responseReceived' in message: print(f"{message}") # print(f"message['method']")
错误信息
TypeError: string indices must be integers
日志示例
{'message': {'method': 'Network.responseReceived', 'params': {...}}}
现有解决方案代码
def new_file_log(self): logs = self.driver.get_log("performance") for log in logs: message = json.loads(log["message"])["message"] if "Network.responseReceived" == message["method"]: print(f"{message['method']}") print(f"{message['params']}") print(f"{message['params']['response']['url']}") print(' ')
优化指导
你的解决方案核心思路是正确的——必须将JSON字符串解析为字典才能访问嵌套字段,以下是几个优化方向:
添加异常处理
避免因日志格式异常导致程序崩溃,比如JSON解析失败、字段缺失的情况:import json def new_file_log(self): logs = self.driver.get_log("performance") for log in logs: try: parsed_log = json.loads(log["message"]) message = parsed_log["message"] if message["method"] == "Network.responseReceived": print(f"{message['method']}") print(f"{message['params']}") response = message["params"].get("response") if response: print(f"{response['url']}") print(' ') except (json.JSONDecodeError, KeyError) as e: # 可记录错误日志或直接跳过无效日志 continue提前过滤日志减少解析次数
在解析前先通过字符串匹配过滤掉无关日志,减少不必要的JSON解析操作,提升效率:def new_file_log(self): logs = self.driver.get_log("performance") target_method = "Network.responseReceived" for log in logs: msg_str = log["message"] if target_method not in msg_str: continue try: parsed_log = json.loads(msg_str) message = parsed_log["message"] if message["method"] == target_method: print(f"{message['method']}") print(f"{message['params']}") print(' ') except (json.JSONDecodeError, KeyError): continue简化代码结构(Python3.8+)
使用海象运算符:=减少变量重复定义,让代码更紧凑:def new_file_log(self): logs = self.driver.get_log("performance") target_method = "Network.responseReceived" for log in logs: if target_method in log["message"] and (parsed := json.loads(log["message"])): message = parsed["message"] if message["method"] == target_method: print(f"{message['method']}") print(f"{message['params']}") print(' ')批量解析与处理
如果日志量较大,可先批量解析有效日志,再进行过滤处理,适合需要多次访问日志字段的场景:def new_file_log(self): logs = self.driver.get_log("performance") # 批量解析有效日志 parsed_logs = [] for log in logs: try: parsed = json.loads(log["message"]) parsed_logs.append(parsed["message"]) except (json.JSONDecodeError, KeyError): continue # 过滤目标日志并处理 target_method = "Network.responseReceived" for message in parsed_logs: if message["method"] == target_method: print(f"{message['method']}") print(f"{message['params']}") print(' ')
内容的提问来源于stack exchange,提问作者ghost239
相关产品推荐
相关产品推荐

