使用Python从json中检索数据

时间:2017-03-29 05:22:52

标签: python json python-2.7

我正在尝试从给定comp1和comp2作为python脚本输入的子元素中检索url

{
  "main1": {
    "comp1": {
      "url": [
        "http://kcdclcm.com",
        "http://dacklsd.com"
       ]
    },
    "comp2": {
      "url": [
           "http://dccmsdlkm.com",
           "http://clsdmcsm.com"
        ]
    }
  },
  "main2": {
    "comp3": {
      "url": [
        "http://csdc.com",
        "http://uihjkn.com"
       ]
    },
    "comp4": {
      "url": [
           "http://jkll.com",
           "http://ackjn.com"
        ]
    }
  }
}

以下是python函数的片段,我试图用来抓取网址

import json
data = json.load(open('test.json'))
def geturl(comp):
    if comp in data[comp]:
        for url in data[comp]['url']:
            print url
geturl('comp1')
geturl('comp2')

我完全理解错误是在脚本的第4行和第5行,因为我试图从json数据的第二个元素中获取url信息而不传递第一个元素'main1'或'main2'。如果我替换第4行和第5行,相同的脚本工作正常:

if comp in data['main1']:
    for url in data['main1'][comp]['url']:

在我的情况下,我不会知道main1和main2,因为用户只需将comp1,comp2,comp3和comp4部分作为脚本的输入。有没有办法找到只有第二个元素已知的网址信息

任何意见都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

您需要遍历dict中的键/值以检查您要搜索的第二级键是否存在:

import json

data = json.load(open('test.json'))

def geturl(comp):
    for k, v in data.items():
        if comp in v and 'url' in v[comp]:
            print "%s" % "\n".join(v[comp]['url'])

geturl('comp1')
geturl('comp2')

答案 1 :(得分:1)

如果你想在每个主要内容中仅使用comp键搜索网址,你只需要这样做:

import json
data = json.load(open('test.json'))
def geturl(comp):
    for mainKey in data:
        main = data[mainKey]
        if comp in main:
            urls = main[comp]['url']
            for url in urls:
                print url

geturl('comp1')
geturl('comp2')