如何从Python中的字典中获取每个URL?

2024-10-03 23:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个代表菜单的yaml字符串。在我从它那里得到一个字典之后,我试着获取URL,简单地说是Parameter的键url和列表的每个第一个元素,而不是Parameter

这是我试过的

import yaml
import jmespath
import pprint

setting = """
GeneralSetting:
  - Description: General Setting
MenuSetting:
  - Description: Menu Setting
  - Setting:
    - AutoMenu:
      - Description: Register menu
      - HelpText: This is for auto create menu
      - Value:
        - Sample:
          - Parameter:
            - icon: fa fa-birthday-cake
            - Active: Y
          - Sample: [Sample]
          - Sample Account: [SampleAccount]
        - Multi Journal:
          - Parameter:
            - icon: fas fa-book
            - url: MultiJournal
        - Foreign Exchange:
          - Parameter:
            - icon: fa fa-money-bill-alt
            - url: ForeignExchange
        - Loan Contract:
          - Parameter:
            - icon: fa fa-capsules
            - Active: Y
          - Loan Contract: [LoanContract,1]
          - Loan Report:
            - Loan Detail Listing: [LoanDetailListing,1]
            - Loan Application Detail Listing: [ReportR003,1]

"""

toDict = yaml.load(setting, yaml.SafeLoader)

pp = pprint.PrettyPrinter(indent=2)

# ALL
ALL       = jmespath.search('MenuSetting[].Setting[].AutoMenu[].Value[].*[]', toDict)
ParentURL       = jmespath.search('MenuSetting[].Setting[].AutoMenu[].Value[].*[0][].Parameter[].url', toDict)

NotParameter = {key:value for item in ALL for it in item for key,value in it.items() if key != "Parameter"}

# pp.pprint(NotParameter)

# print ('-----')
SubURL = jmespath.search('*[0]', NotParameter)

SubSubURL = jmespath.search('*[].*[][]', NotParameter)

pp.pprint(ParentURL)
print('---')
pp.pprint(SubURL)
print('---')
pp.pprint(SubSubURL)

因此,我只能对Parameter下的url父URL(如[MultiJournal,ForeignExchange])做得很好,但不能对子URL和子URL做得很好

我只想把url的最终结果作为一个列表

[Sample,SampleAccount,MultiJournal,ForeignExchange,LoanContract,LoanDetailListing,Report/R003]

我试了好几种方法,但还是没有得到结果

有没有办法让我得到这样的价值清单?谢谢


Tags: sampleurlyamlforsearchparametersettingpp
1条回答
网友
1楼 · 发布于 2024-10-03 23:25:30

尽管我坚信您的YAML结构不是您应该拥有的结构(下面的内容更多),但下面是一个与您的预期输出相匹配的查询:

MenuSetting[].Setting[].AutoMenu[2].[Value[0].[Sample[].Sample, Sample[]."Sample Account"], Value[]."Multi Journal"[].Parameter[1].url, Value[]."Foreign Exchange"[].Parameter[1].url, Value[]."Loan Contract"[]."Loan Contract"[0], Value[]."Loan Contract"[]."Loan Report"[0]."Loan Detail Listing"[0], Value[]."Loan Contract"[]."Loan Report"[1]."Loan Application Detail Listing"[0]][][][][]

基于YAML的JSON等价物:

{
  "GeneralSetting": [
    {
      "Description": "General Setting"
    }
  ],
  "MenuSetting": [
    {
      "Description": "Menu Setting"
    },
    {
      "Setting": [
        {
          "AutoMenu": [
            {
              "Description": "Register menu"
            },
            {
              "HelpText": "This is for auto create menu"
            },
            {
              "Value": [
                {
                  "Sample": [
                    {
                      "Parameter": [
                        {
                          "icon": "fa fa-birthday-cake"
                        },
                        {
                          "Active": "Y"
                        }
                      ]
                    },
                    {
                      "Sample": [
                        "Sample"
                      ]
                    },
                    {
                      "Sample Account": [
                        "SampleAccount"
                      ]
                    }
                  ]
                },
                {
                  "Multi Journal": [
                    {
                      "Parameter": [
                        {
                          "icon": "fas fa-book"
                        },
                        {
                          "url": "MultiJournal"
                        }
                      ]
                    }
                  ]
                },
                {
                  "Foreign Exchange": [
                    {
                      "Parameter": [
                        {
                          "icon": "fa fa-money-bill-alt"
                        },
                        {
                          "url": "ForeignExchange"
                        }
                      ]
                    }
                  ]
                },
                {
                  "Loan Contract": [
                    {
                      "Parameter": [
                        {
                          "icon": "fa fa-capsules"
                        },
                        {
                          "Active": "Y"
                        }
                      ]
                    },
                    {
                      "Loan Contract": [
                        "LoanContract",
                        1
                      ]
                    },
                    {
                      "Loan Report": [
                        {
                          "Loan Detail Listing": [
                            "LoanDetailListing",
                            1
                          ]
                        },
                        {
                          "Loan Application Detail Listing": [
                            "ReportR003",
                            1
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

此查询提供:

[
  "Sample",
  "SampleAccount",
  "MultiJournal",
  "ForeignExchange",
  "LoanContract",
  "LoanDetailListing",
  "ReportR003"
]

现在我相信你的YAML有很多问题,你在YAML中混淆了列表和字典

列表将以破折号开头:

- carrot
- onions
- potatoes

字典是一组键/值对,它们都表示父键的属性:

car:
  brand: ferrari
  model: 488
  engine: "3.9 l twin-turbocharged"

当然,您可以有一个字典列表:

- name: duck
  sound: quack
  legs: 2
- name: cow
  sound: moo
  legs: 4

因此,在您的YAML中,如果我将重点放在它的顶部,我相信它应该是沿着以下路线:

GeneralSetting:
  Description: General Setting
MenuSetting:
  Description: Menu Setting
  Setting:
    AutoMenu:
      Description: Register menu
      HelpText: This is for auto create menu
      Value:
        Sample:
          Parameter:
            icon: fa fa-birthday-cake
            Active: Y
          Sample: Sample
          Sample Account: SampleAccount
        Multi Journal:
          Parameter:
            icon: fas fa-book
            url: MultiJournal
        Foreign Exchange:
          Parameter:
            icon: fa fa-money-bill-alt
            url: ForeignExchange 
# ...

当然,这将完全改变和简化查询,例如,基于此YAML,生成的JSON将是:

{
  "GeneralSetting": {
    "Description": "General Setting"
  },
  "MenuSetting": {
    "Description": "Menu Setting",
    "Setting": {
      "AutoMenu": {
        "Description": "Register menu",
        "HelpText": "This is for auto create menu",
        "Value": {
          "Sample": {
            "Parameter": {
              "icon": "fa fa-birthday-cake",
              "Active": "Y"
            },
            "Sample": "Sample",
            "Sample Account": "SampleAccount"
          },
          "Multi Journal": {
            "Parameter": {
              "icon": "fas fa-book",
              "url": "MultiJournal"
            }
          },
          "Foreign Exchange": {
            "Parameter": {
              "icon": "fa fa-money-bill-alt",
              "url": "ForeignExchange"
            }
          }
        }
      }
    }
  }
}

对第一个元素的查询将是:

MenuSetting.Setting.AutoMenu.Value.[Sample.Sample, Sample."Sample Account", *.Parameter.url][]

这将产生预期的:

[
  "Sample",
  "SampleAccount",
  "MultiJournal",
  "ForeignExchange"
]

相关问题 更多 >