2016-11-09 12 views
0

APIからJSONオブジェクトを取得しています。私はJSONデータをPython辞書に引き出しました。私は今、それがネストされ、サブリストとサブディクショナリを持っているので、辞書からデータを抽出するのが難しいと思っています。より良いデータが引き出さの本質を理解するために、私は以下試した:上記から複雑なネストされたPython辞書に保存されたJSONオブジェクトを簡単に読み取る方法

url = "https://api.xyz.com/v11/api.json?KEY=abc&LOOKUP=bbb" 
response = requests.get(url) 
data = response.json() 
print (type(data)) 
print(data.keys()) 
print (type(data['Results'])) 
print (len(data['Results'])) 
print (type(data['Results'][0])) 
print (data['Results'][0].keys()) 
print (type(data['Results'][0]['Result'])) 
print ((data['Results'][0]['Result'].keys())) 
print (type((data['Results'][0]['Result']['Paths']))) 
print (len((data['Results'][0]['Result']['Paths']))) 
print (type((data['Results'][0]['Result']['Paths'][0]))) 
print ((data['Results'][0]['Result']['Paths'][0].keys())) 
print (type(data['Results'][0]['Result']['Paths'][0]['Technologies'])) 
print (len(data['Results'][0]['Result']['Paths'][0]['Technologies'])) 
print ((data['Results'][0]['Result']['Paths'][0]['Technologies'][8].keys())) 
print (data['Results'][0]['Result']['Paths'][0]['Technologies'][8]['Tag']) 

、私は次の出力ました:これの他の反復からの

<class 'dict'> 
dict_keys(['Results', 'Errors']) 
<class 'list'> 
1 
<class 'dict'> 
dict_keys(['Lookup', 'LastIndexed', 'FirstIndexed', 'Meta', 'Result']) 
<class 'dict'> 
dict_keys(['Paths', 'IsDB', 'Spend']) 
<class 'list'> 
9 
<class 'dict'> 
dict_keys(['LastIndexed', 'Technologies', 'Domain', 'SubDomain', 'FirstIndexed', 'Url']) 
<class 'list'> 
77 
dict_keys(['FirstDetected', 'Name', 'LastDetected', 'Categories', 'Description', 'IsPremium', 'Tag', 'Link']) 
cdn 

を、私はに依存していることを知っています私が 'Paths'の後で選んだリスト項目は、5-100までの 'Technologies'のリスト長を変えることができます。私は特に、 'タグ' == A.のすべての技術のリストを取得することに興味があります。 'タグ' == A.を持つすべてのエントリのすべての上位レベルの情報を持つテーブルを作成できるようにします。理想的には、この情報をCSVファイルで取得したいと考えています。私はPandas dataframe from nested dictionaryCreate a dictionary with list comprehension in PythonConstruct pandas DataFrame from items in nested dictionaryを見てきましたが、は、特に( 'Paths'の後に)リストにアクセスすることについて混乱します。

これまでのコードは、すべてのデータが1つのセルに入り、すべて使用できないため、まったく役に立たない単純なデータダンプです。

+0

JSONファイルの最初の2つの要素を表示できますか? – MMF

+0

FlatDictを実行すると、https://pypi.python.org/pypi/flatdictに役立ち、CSV形式への変換を支援するフラットアウトされた辞書を繰り返すことができます –

答えて

0

私はこれを行う方法を考え出しました。以下のコード。

import json 
import requests 
import pandas 

domaindict = {} 
tech_info = {} 
tag = 'mobile' 

'''For every domain, pulls the api response, stores in dictionary, and gets dataframe 
with technology info by calling the get_paths and set_df functions''' 

def get_info(d): 
    url = "https://api.xyz.com/v11/api.json?KEY=abc&LOOKUP={}".format(d) 
    response = requests.get(url) 
    data = response.json() 
    domaindict[d] = data 
    paths = get_paths(d) 
    final_info = set_df(paths) 
    return final_info 

'''Gets the list of paths for a domain'''   
def get_paths(d): 
    paths = domaindict[d]['Results'][0]['Result']['Paths'] 
    return paths 

'''Sets up dataframe to get info at the technology level. Loops through the technology list and path lists.''' 
def set_df(paths): 
    df_m = pandas.DataFrame({'Domain':[],'Url':[],'Subdomain':[],'Technology Name':[],'Technology Description':[],'Technology Tag':[]}) 
    for path in paths: 
     domain_name = path['Domain'] 
     url = path['Url'] 
     subdomain = path['SubDomain'] 
     techs = path['Technologies'] 
     for tech in techs: 
      tech_name = tech['Name'] 
      tech_desc = tech['Description'] 
      tech_tag = tech['Tag'] 
      df = pandas.DataFrame({'Domain':[domain_name], 'Url':[url], 'Subdomain':[subdomain], 
            'Technology Name':[tech_name], 
            'Technology Description': [tech_desc], 
            'Technology Tag': [tech_tag]}) 
      df_m = df_m.append(df) 
     return df_m 


'''loops through the csv file with list of domain names, calls the get_info function and saves dataframe with technology info for 
every domain in one file''' 

read_domains = pandas.read_excel('domain.xlsx', header = None) 
df_f = pandas.DataFrame() 
for d in read_domains.values: 
    print(d[0]) 
    df_i = get_info(d[0]) 
    df_f = df_f.append(df_i) 


with pandas.ExcelWriter('mobile.xlsx') as w: 
    df_f.to_excel(w,'mobile') 
関連する問題