父子节点内容和个数提取

有时我们需要获得菜单的内容和个数,这个时候通常有父子菜单,那么怎么分别获取到他们呢?以下面的智慧物业管理系统为例,有7个父节点,每个父节点下面有子节点。如何把父节点名称和总数,以及子节点的名称和总数提取出来呢?

1、抓取返回值

首先我们应该先抓取返回值

可以放notepad++里面,

也可以放pycharm里面查看

2、常量获取对应的父子节点的名称和父子节点的总数试验V1

 1、首先提取getrouters接口的返回内容

import requests

# 定义接口地址
url='https://svr-6-9009.share.51env.net/prod-api/getRouters'

# 定义token参数
token="eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImM2YjI1OGMzLTRlZDQtNGM5OS05YWYwLTgyOTc1ZDY0MzcxZiJ9.FRX40yX-9hdENLARAn5N_n9JtlGsKQRbTNmKsJBu0GX70RRVUR2pvAjBeFSv61lHy-tzJdLj5P3HPsdtsjw3yg"
header={'Authorization':'Bearer '+token}
# 发送请求并获取
response=requests.get(url,headers=header).json()
print(response)

输出结果:

{'msg': '操作成功', 'code': 200, 'data': [{'name': 'Payment', 'path': '/payment', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '物业收费', 'icon': 'shopping', 'noCache': False, 'link': None}, 'children': [{'name': 'Housepay', 'path': 'housepay', 'hidden': False, 'component': 'pms/housepay', 'meta': {'title': '商铺综合收费', 'icon': 'money', 'noCache': False, 'link': None}}, {'name': 'Temppay', 'path': 'temppay', 'hidden': False, 'component': 'pms/paymenttemp', 'meta': {'title': '临时收费', 'icon': 'form', 'noCache': False, 'link': None}}, {'name': 'Deposit', 'path': 'deposit', 'hidden': False, 'component': 'pms/paymentdeposit', 'meta': {'title': '押金管理', 'icon': 'dict', 'noCache': False, 'link': None}}, {'name': 'Pre', 'path': 'pre', 'hidden': False, 'component': 'pms/paymentpre', 'meta': {'title': '预存款管理', 'icon': 'documentation', 'noCache': False, 'link': None}}]}, {'name': 'Fee', 'path': '/fee', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '收费数据管理', 'icon': 'build', 'noCache': False, 'link': None}, 'children': [{'name': 'Meter', 'path': 'meter', 'hidden': False, 'component': 'pms/paymentmeter', 'meta': {'title': '抄表数据管理', 'icon': 'time-range', 'noCache': False, 'link': None}}, {'name': 'Bill', 'path': 'bill', 'hidden': False, 'component': 'pms/paymentbill', 'meta': {'title': '商铺收费数据', 'icon': 'edit', 'noCache': False, 'link': None}}]}, {'name': 'Config', 'path': '/config', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '基础数据管理', 'icon': 'cascader', 'noCache': False, 'link': None}, 'children': [{'name': 'Configfeeitem', 'path': 'configfeeitem', 'hidden': False, 'component': 'pms/configfeeitem', 'meta': {'title': '收费项管理', 'icon': 'list', 'noCache': False, 'link': None}}, {'name': 'Pms/confighouseblock', 'path': 'pms/confighouseblock', 'hidden': False, 'component': 'pms/confighouseblock', 'meta': {'title': '商业区管理', 'icon': 'example', 'noCache': False, 'link': None}}, {'name': 'Config/house', 'path': 'config/house', 'hidden': False, 'component': 'pms/confighouse', 'meta': {'title': '商铺管理', 'icon': 'component', 'noCache': False, 'link': None}}, {'name': 'Config/contract', 'path': 'config/contract', 'hidden': False, 'component': 'pms/confighousecontract', 'meta': {'title': '商铺租售', 'icon': 'switch', 'noCache': False, 'link': None}}]}, {'name': 'Statistics', 'path': '/statistics', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '统计报表', 'icon': 'monitor', 'noCache': False, 'link': None}, 'children': [{'name': 'DailyReport', 'path': 'dailyReport', 'hidden': False, 'component': 'statistics/daily', 'meta': {'title': '收费日报表', 'icon': 'job', 'noCache': False, 'link': None}}, {'name': 'DailyFee', 'path': 'dailyFee', 'hidden': False, 'component': 'statistics/dailyFee', 'meta': {'title': '收费项汇总表', 'icon': 'excel', 'noCache': False, 'link': None}}, {'name': 'PayLog', 'path': 'payLog', 'hidden': False, 'component': 'statistics/paylog', 'meta': {'title': '收费明细表', 'icon': 'date-range', 'noCache': False, 'link': None}}, {'name': 'NextFee', 'path': 'nextFee', 'hidden': False, 'component': 'statistics/nextFee', 'meta': {'title': '待生成的费用', 'icon': 'skill', 'noCache': False, 'link': None}}, {'name': 'PreAccount', 'path': 'preAccount', 'hidden': False, 'component': 'statistics/preAccount', 'meta': {'title': '预收款余额', 'icon': 'druid', 'noCache': False, 'link': None}}, {'name': 'Fee', 'path': 'fee', 'hidden': False, 'component': 'statistics/payment', 'meta': {'title': '收费统计', 'icon': 'chart', 'noCache': False, 'link': None}}, {'name': 'UserFee', 'path': 'userFee', 'hidden': False, 'component': 'statistics/payment/house', 'meta': {'title': '收费统计(商铺)', 'icon': 'chart', 'noCache': False, 'link': None}}, {'name': 'Overdue', 'path': 'overdue', 'hidden': False, 'component': 'statistics/overdue', 'meta': {'title': '欠费数据', 'icon': 'server', 'noCache': False, 'link': None}}]}, {'name': 'System', 'path': '/system', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '系统管理', 'icon': 'system', 'noCache': False, 'link': None}, 'children': [{'name': 'User', 'path': 'user', 'hidden': False, 'component': 'system/user/index', 'meta': {'title': '用户管理', 'icon': 'user', 'noCache': False, 'link': None}}, {'name': 'Role', 'path': 'role', 'hidden': False, 'component': 'system/role/index', 'meta': {'title': '角色管理', 'icon': 'peoples', 'noCache': False, 'link': None}}, {'name': 'Menu', 'path': 'menu', 'hidden': False, 'component': 'system/menu/index', 'meta': {'title': '菜单管理', 'icon': 'tree-table', 'noCache': False, 'link': None}}, {'name': 'Dept', 'path': 'dept', 'hidden': False, 'component': 'system/dept/index', 'meta': {'title': '部门管理', 'icon': 'tree', 'noCache': False, 'link': None}}, {'name': 'Post', 'path': 'post', 'hidden': False, 'component': 'system/post/index', 'meta': {'title': '岗位管理', 'icon': 'post', 'noCache': False, 'link': None}}, {'name': 'Dict', 'path': 'dict', 'hidden': False, 'component': 'system/dict/index', 'meta': {'title': '字典管理', 'icon': 'dict', 'noCache': False, 'link': None}}, {'name': 'Config', 'path': 'config', 'hidden': False, 'component': 'system/config/index', 'meta': {'title': '参数设置', 'icon': 'edit', 'noCache': False, 'link': None}}, {'name': 'Notice', 'path': 'notice', 'hidden': False, 'component': 'system/notice/index', 'meta': {'title': '通知公告', 'icon': 'message', 'noCache': False, 'link': None}}, {'name': 'Log', 'path': 'log', 'hidden': False, 'redirect': 'noRedirect', 'component': 'ParentView', 'alwaysShow': True, 'meta': {'title': '日志管理', 'icon': 'log', 'noCache': False, 'link': None}, 'children': [{'name': 'Operlog', 'path': 'operlog', 'hidden': False, 'component': 'monitor/operlog/index', 'meta': {'title': '操作日志', 'icon': 'form', 'noCache': False, 'link': None}}, {'name': 'Logininfor', 'path': 'logininfor', 'hidden': False, 'component': 'monitor/logininfor/index', 'meta': {'title': '登录日志', 'icon': 'logininfor', 'noCache': False, 'link': None}}]}]}, {'name': 'Monitor', 'path': '/monitor', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '系统监控', 'icon': 'monitor', 'noCache': False, 'link': None}, 'children': [{'name': 'Online', 'path': 'online', 'hidden': False, 'component': 'monitor/online/index', 'meta': {'title': '在线用户', 'icon': 'online', 'noCache': False, 'link': None}}, {'name': 'Job', 'path': 'job', 'hidden': False, 'component': 'monitor/job/index', 'meta': {'title': '定时任务', 'icon': 'job', 'noCache': False, 'link': None}}, {'name': 'Druid', 'path': 'druid', 'hidden': False, 'component': 'monitor/druid/index', 'meta': {'title': '数据监控', 'icon': 'druid', 'noCache': False, 'link': None}}, {'name': 'Server', 'path': 'server', 'hidden': False, 'component': 'monitor/server/index', 'meta': {'title': '服务监控', 'icon': 'server', 'noCache': False, 'link': None}}, {'name': 'Cache', 'path': 'cache', 'hidden': False, 'component': 'monitor/cache/index', 'meta': {'title': '缓存监控', 'icon': 'redis', 'noCache': False, 'link': None}}]}, {'name': 'Tool', 'path': '/tool', 'hidden': False, 'redirect': 'noRedirect', 'component': 'Layout', 'alwaysShow': True, 'meta': {'title': '系统工具', 'icon': 'tool', 'noCache': False, 'link': None}, 'children': [{'name': 'Build', 'path': 'build', 'hidden': False, 'component': 'tool/build/index', 'meta': {'title': '表单构建', 'icon': 'build', 'noCache': False, 'link': None}}, {'name': 'Gen', 'path': 'gen', 'hidden': False, 'component': 'tool/gen/index', 'meta': {'title': '代码生成', 'icon': 'code', 'noCache': False, 'link': None}}, {'name': 'Swagger', 'path': 'swagger', 'hidden': False, 'component': 'tool/swagger/index', 'meta': {'title': '系统接口', 'icon': 'swagger', 'noCache': False, 'link': None}}]}]}
# 提取父节点的名称
# 提取父节点的名称
parentmenu=response['data'][0]['meta']['title']
print(parentmenu)

输出结果:

物业收费
# 提取子节点的名称
# 提取子节点的名称
childmenu=response['data'][0]['children'][0]['meta']['title']
print(childmenu)

输出结果:

商铺综合收费
#子节点总个数问题
#子节点总个数问题
childmenu=response['data'][2]['children']
childcount=len(childmenu)
print(childcount)

输出结果:

4

3、for循环获取对应的父子节点的名称和父子节点的总数试验V2

首先获取父节点的名字:

# 获取父节点的名称
for i in range(0,7):
    parentmenu=response['data'][i]['meta']['title']
    print(parentmenu)

可以看到,返回值data下的列表第一个字典的meta下面,对应title就是我们要取到的父节点的名字。

输出结果:

物业收费
收费数据管理
基础数据管理
统计报表
系统管理
系统监控
系统工具

接着提取子节点的名称,

# 获取子节点的名称
for j in range(0,3):
    childmenu=response['data'][0]['children'][j]['meta']['title']
    print(childmenu)

输出结果:

商铺综合收费
临时收费
押金管理

获取所有子节点的个数:

#获取所有子节点的个数
for k in range(0,7):
    childmenu=response['data'][k]['children']
    childcount=len(childmenu)
    print(childcount)

输出结果:

4
2
4
8
9
5
3

此时可以用try ,except改进获取所有子节点的名称

# 获取所有子节点的名称
for m in range(0,7):
    print(m + 1)
    for j in range(0,9):
        try:
            childmenu=response['data'][m]['children'][j]['meta']['title']
        except:
            break
        else:
            print(childmenu)

这里m+1是用来展示序号的。

1
商铺综合收费
临时收费
押金管理
预存款管理
2
抄表数据管理
商铺收费数据
3
收费项管理
商业区管理
商铺管理
商铺租售
4
收费日报表
收费项汇总表
收费明细表
待生成的费用
预收款余额
收费统计
收费统计(商铺)
欠费数据
5
用户管理
角色管理
菜单管理
部门管理
岗位管理
字典管理
参数设置
通知公告
日志管理
6
在线用户
定时任务
数据监控
服务监控
缓存监控
7
表单构建
代码生成
系统接口

4、列表获取对应的父子节点的名称和父子节点的总数试验V3

1、提取父子节点的内容存入list中
parentList=[]
for i in range(0,7):
    parentmenu=response['data'][i]['meta']['title']
    print(parentmenu)
    parentList.append(parentmenu)

parentnum=len(parentList)
print(parentnum)

其中parentmenu中存放的是父节点的列表,parentnum打印的是父节点的个数。

输出结果:

物业收费
收费数据管理
基础数据管理
统计报表
系统管理
系统监控
系统工具
7
2、提取子节点的内容存入list中
childList=[]
for m in range(0,7):
    print(m+1)
    childtmp = []
    for j in range(0,9):
        try:
            childmenu=response['data'][m]['children'][j]['meta']['title']
        except:
            break
        else:
            print(childmenu)
            childtmp.append(childmenu)
    print(childtmp)
    childList.append(childtmp)
print(childList)

这里注意,

print(m+1)   #打印父节点的顺序
print(childtmp)   #打印子节点的临时列表
print(childList)  #最后将整个列表内容输出
1
商铺综合收费
临时收费
押金管理
预存款管理
['商铺综合收费', '临时收费', '押金管理', '预存款管理']
2
抄表数据管理
商铺收费数据
['抄表数据管理', '商铺收费数据']
3
收费项管理
商业区管理
商铺管理
商铺租售
['收费项管理', '商业区管理', '商铺管理', '商铺租售']
4
收费日报表
收费项汇总表
收费明细表
待生成的费用
预收款余额
收费统计
收费统计(商铺)
欠费数据
['收费日报表', '收费项汇总表', '收费明细表', '待生成的费用', '预收款余额', '收费统计', '收费统计(商铺)', '欠费数据']
5
用户管理
角色管理
菜单管理
部门管理
岗位管理
字典管理
参数设置
通知公告
日志管理
['用户管理', '角色管理', '菜单管理', '部门管理', '岗位管理', '字典管理', '参数设置', '通知公告', '日志管理']
6
在线用户
定时任务
数据监控
服务监控
缓存监控
['在线用户', '定时任务', '数据监控', '服务监控', '缓存监控']
7
表单构建
代码生成
系统接口
['表单构建', '代码生成', '系统接口']
[['商铺综合收费', '临时收费', '押金管理', '预存款管理'], ['抄表数据管理', '商铺收费数据'], ['收费项管理', '商业区管理', '商铺管理', '商铺租售'], ['收费日报表', '收费项汇总表', '收费明细表', '待生成的费用', '预收款余额', '收费统计', '收费统计(商铺)', '欠费数据'], ['用户管理', '角色管理', '菜单管理', '部门管理', '岗位管理', '字典管理', '参数设置', '通知公告', '日志管理'], ['在线用户', '定时任务', '数据监控', '服务监控', '缓存监控'], ['表单构建', '代码生成', '系统接口']]

Process finished with exit code 0

愿每个测试都能顺利转为测试开发,提高职业技能,成为前1%的存在,为社会创造更大的价值,为公司节约更多的成本,为自己和家庭谋求更高的收入,所有人不受职业年龄限制,越老越吃香,直至财富自由;愿测试技术越来越进步,软件质量进一步得到提高,效率提高。愿祖国更加美好,人民更加幸福。多喜乐,常安宁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/763002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang-context理解

golang-context笔记整理 golang为何设计context?代码上理解原理空context类cancelCtx类.withcancelctx方法 timerCtx类valueCtx类 golang为何设计context? 有并发特性的语言中,都会有一种说法:创建异步线程或者携程的时候&#x…

在postman中调试supabase的API接口

文章目录 在supabase中获取API地址和key知道它的restfull风格在postman中进行的设置1、get请求调试2、post新增用户调试3、使用patch更新数据,不用put!4、delete删除数据 总结 在supabase中获取API地址和key 首先登录dashboard后台,首页- 右…

OFDM的缺点与关键技术

子载波间干扰英文简写ICI,ICI可能由各种原因引起 在多径信道中,CP小于最大附加时延时收发系统载波频率偏差和采样偏差收发系统相对移动,存在多普勒频移 ICI是制约OFDM系统性能的主要重要因素之一 对频率偏差敏感----->同步技术&#xff0…

Figma-ui设计学习APP Store

Figma汉化:Figma 中文社区_插件组件库,软件汉化教程 - Figma.Cool 选择Chorme汉化版离线包 插件安装: 打开浏览器安装扩展,解压加载进去即可。 打开标尺,设置左右内边距参考线(左21 右356),wi…

同一个excel表格,为什么在有的电脑上会显示#NAME?

一、哪些情况会产生#NAME?的报错 1.公式名称拼写错误 比如求和函数SUM,如果写成SUN就会提示#NAME?报错。 2.公式中的文本值未添加双引号 如下图: VLOOKUP(丙,A:B,2,0) 公式的计算结果会返回错误值#NAME?,这是因为公式中文本…

PostgreSQL的学习心得和知识总结(一百四十七)|深入理解PostgreSQL数据库之transaction chain的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…

反激开关电源反馈电路相关参数选型

Vb的电压正常变化范围是:0-1V(最低0V,由于有稳压管,最高不会超过1V) Vb的电压越高,则输出占空比越大,Vb电压越低,则输出占空比越小 那么Va的正常变化范围应该是:1.4-4.…

文本生成sql模型(PipableAI/pip-sql-1.3b)

安装环境 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 pip install transformers 代码 question "What are the email address, town and county of the customers who are of the least common gender?"sc…

IT专业入门——高考假期预习指南,我来做你的引路人

目录 认识IT知识体系 什么是计算机 按规模、速度和功能分类 按照其工作模式分类 硬件 操作系统 编程语言 对学习语言的一点建议 对于学python的一点看法 网络 数据结构与算法 数据库 Web开发 Web前端 Web后端 基础预习指南 技术路线学习一览 学习资源推荐 刷…

白话负载均衡、正反向代理(入门科普版)

什么是负载均衡?为什么需要负载均衡 从字面上理解,什么是负载,服务器承受访问量的大小是负载,但是单台服务器的访问性能是有限的,最典型的例子就是双十一、春运抢票这种,这时候就需要一种方案来解决这类问…

ARM功耗管理软件之DVFSAVS

安全之安全(security)博客目录导读 思考:功耗管理软件栈及示例?WFI&WFE?时钟&电源树?DVFS&AVS? 目录 一、ARM功耗管理软件之DVFS 二、ARM功耗管理软件之AVS 一、ARM功耗管理软件之DVFS 有一个实现特定…

SparkSQL调优

SparkSQL调优 文章目录 SparkSQL调优Explain 查看执行计划语法执行计划处理流程 资源调优内存说明spark任务提交到yarn上运行命令 CPU优化 SparkSQL语法优化基于RBO优化基于CBO优化广播join方式一:通过参数指定自动广播方式二:强行广播 SMB Join 数据倾斜…

Go线程实现模型-P

P 概述 P是G能够在M中运行关键。Go的运行时系统会适时地让P与不同的M建立或断开关联,以使P中的那些可运行的G能够及时获得,这与操作系统内核在CPU之上实时切换不同进程或线程的情况类似 改变P的数量 改变单个Go程序间拥有的P的最大数量有两种方法 调…

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏

安卓手机的自带录屏在哪里找?5个软件帮助你快速给手机录屏 在安卓手机上进行屏幕录制是一项非常实用的功能,特别是对于需要录制游戏操作、制作教程或演示的用户来说。虽然部分安卓手机可能已经预装了屏幕录制功能,但有时候这些功能可能隐藏在…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…

每日Attention学习7——Frequency-Perception Module

模块出处 [link] [code] [ACM MM 23] Frequency Perception Network for Camouflaged Object Detection 模块名称 Frequency-Perception Module (FPM) 模块作用 获取频域信息,更好识别伪装对象 模块结构 模块代码 import torch import torch.nn as nn import to…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

IMU在手语识别中的应用

近期,一款由美国和中国科研团队联合研发的新型的穿戴设备——SignRing,以其独特的IMU(惯性测量单元)技术,为聋哑人士的手语识别带来了革命性的突破。SignRing不仅极大地扩展了手语识别的词汇量,更提高了识别…

C++多态~~的两个特殊情况

目录 1.多态的概念 2.简单认识 (1)一个案例 (2)多态的两个满足条件 (3)虚函数的重写 (4)两个特殊情况 1.多态的概念 (1)多态就是多种形态; …

windows USB设备驱动开发-双角色驱动

在USB的通讯协议中,规定发起连接的一方为主机(Host),接受连接的一方为设备,这可以用U盘插入电脑举个例子,当U盘插入电脑后,电脑这边主动发起查询和枚举,U盘被动响应查询和数据存取。 USB 双角色驱动程序堆…