You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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字符串解析为字典才能访问嵌套字段,以下是几个优化方向:

  1. 添加异常处理
    避免因日志格式异常导致程序崩溃,比如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
    
  2. 提前过滤日志减少解析次数
    在解析前先通过字符串匹配过滤掉无关日志,减少不必要的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
    
  3. 简化代码结构(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(' ')
    
  4. 批量解析与处理
    如果日志量较大,可先批量解析有效日志,再进行过滤处理,适合需要多次访问日志字段的场景:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:01:02