如何使用Python json.load()方法访问从网站复制的JSON数据
类JSON预览文本Python解析方案
你复制的内容不是标准JSON格式,是浏览器开发者工具里折叠对象的预览文本,存在键名无双引号、…占位未展开内容、无顶层大括号包裹的问题,无法直接用json.load()/json.loads()解析,可按以下两种方案处理:
方案1:优先获取原始标准JSON(推荐)
当前你复制的是面板里的展开预览内容,不是接口返回的原始数据:
- 打开浏览器开发者工具,切换到「Network」面板
- 刷新页面找到对应数据接口,直接复制「Response」标签下的完整标准JSON
- 拿到标准JSON后直接用
json.loads()即可正常解析,零出错,是最稳妥的方案。
方案2:直接解析当前复制的预览文本
如果暂时拿不到原始接口数据,可通过正则逐行解析文本,跳过折叠的不完整行,组装成可直接按字段取值的字典结构,代码如下:
import re from collections import defaultdict def parse_preview_data(raw_text: str) -> dict: nodes = {} current_node = None # 匹配24位十六进制ID开头的新节点起始行 node_start_re = re.compile(r'^([0-9a-f]{24}):\s*{') # 匹配字段行,支持字符串、数字两类值 field_re = re.compile(r'^\s*(\w+):\s*(?:"([^"]+)"|(\d+))\s*$') for line in raw_text.splitlines(): line = line.strip() # 跳过空行、带省略号的折叠预览行 if not line or '…' in line: continue # 识别到新节点,初始化节点字典 start_match = node_start_re.match(line) if start_match: nid = start_match.group(1) current_node = defaultdict(str) current_node["id"] = nid nodes[nid] = current_node continue # 提取当前节点的字段和值 field_match = field_re.match(line) if field_match and current_node: key = field_match.group(1) value = field_match.group(2) if field_match.group(2) else int(field_match.group(3)) current_node[key] = value return nodes # 调用示例 if __name__ == "__main__": # 替换为你实际复制的文本内容 copied_text = """ 5b8e6b4b4f0ca1fbcd66e34e: {parentId: "52ff2e04e4b0b193ed664d45", nodeInfo: {position: 102,…}, id: "5b8e6b4b4f0ca1fbcd66e34e",…} id: "5b8e6b4b4f0ca1fbcd66e34e" name: "Parental Control" nodeInfo: {position: 102,…} description: "Companies that provide parental control solutions to keep children away from online risks" position: 102 parentId: "52ff2e04e4b0b193ed664d45" 5b8e7c244f0c6c2263aaf8d2: {parentId: "5330677ae4b09e5482339b7a", nodeInfo: {position: 38,…}, id: "5b8e7c244f0c6c2263aaf8d2",…} id: "5b8e7c244f0c6c2263aaf8d2" name: "Anti Spyware" nodeInfo: {position: 38,…} description: "Companies that provides tools to remove spyware such as adware, keyboard loggers, hijackers etc" position: 38 parentId: "5330677ae4b09e5482339b7a" 5b8f9d0f4f0c7c4d2daea8e8: {parentId: "52ff2e3de4b0b193ed664d4a", nodeInfo: {position: 42,…}, id: "5b8f9d0f4f0c7c4d2daea8e8",…} id: "5b8f9d0f4f0c7c4d2daea8e8" name: "Anti Theft" nodeInfo: {position: 42,…} description: "Companies that provide anti-theft solutions with features such as remote lock, remote wipe, theft detection etc" position: 42 parentId: "52ff2e3de4b0b193ed664d4a" """ data = parse_preview_data(copied_text) # 按你需要的逻辑提取字段 for nid, x in data.items(): parent = x["parentId"] name = x["name"] node_id = x["id"] print(f"节点ID:{node_id},名称:{name},父级ID:{parent}")
使用说明
- 解析完成后返回的
data是顶层以节点ID为键的字典,遍历后每个节点对象x都支持直接按x["parentId"]、x["name"]、x["id"]的方式取值,完全匹配你的使用需求 - 带
…的折叠预览行会被自动过滤,这些行是浏览器的缩写展示,下方已经有展开的完整字段,不会影响解析结果 - 如果后续复制的内容包含布尔值、完整展开的嵌套对象等其他类型值,只要对应调整
field_re的正则匹配规则即可扩展支持。
内容的提问来源于stack exchange,提问作者BQuist
相关产品推荐
相关产品推荐

