Search code examples
pythonjsonloopsinstagram-api

how to fetch data from json schema? error shown-TypeError: string indices must be integers


I have a json response from an API in this way:-

 {
"meta":  {
"code": 200
},
"data":  {
"username": "luxury_mpan",
"bio": "Recruitment Agents👑👑👑👑\nThe most powerful manufacturers,\nwe have the best quality.\n📱Wechat:13255996580💜💜\n📱Whatsapp:+8618820784535",
"website": "",
"profile_picture": "https://scontent.cdninstagram.com/t51.2885-19/10895140_395629273936966_528329141_a.jpg",
"full_name": "Mpan",

 "counts":  {
   "media": 17774,
  "followed_by": 7982,
  "follows": 7264
 },

 "id": "1552277710"
 }
}

I want to fetch the data in "media", "followed_by" and "follows" and store it in three different lists as shown in the below code:--

for r in range(1,5):
    var=r,st.cell(row=r,column=3).value
    xy=var[1]
    ij=str(xy)
    myopener=Myopener()
    url=myopener.open('https://api.instagram.com/v1/users/'+ij+'/?access_token=641567093.1fb234f.a0ffbe574e844e1c818145097050cf33')
    beta=json.load(url)
    for item in beta['data']:
        list1.append(item['media'])
        list2.append(item['followed_by'])
        list3.append(item['follows'])

When I run it, it shows the error TypeError: string indices must be integers How would my loop change in order to fetch the above mentioned values?

Also, Asking out of curiosity:- Is there any way to fetch the Watzapp no from the "BIO" key in data dictionary?

I have referred questions similar to this and still did not get my answer. Please help!


Solution

  • beta['data'] is a dictionary object. When you iterate over it with for item in beta['data'], the values taken by item will be the keys of the dictionary: "username", "bio", etc.

    So then when you ask for, e.g., item['media'] it's like asking for "username"['media'], which of course doesn't make any sense.

    It isn't quite clear what it is that you want: is it just the stuff inside counts? If so, then instead of for item in beta['data']: you could just say item = beta['data']['counts'], and then item['media'] etc. will be the values you want.

    As to your secondary question: I suggest looking into regular expressions.