Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python requests and Json for loop

Tags:

python

json

I am trying to loop through the attached JSON and print out the name and price of each item in the data. My problem is that it repeats printing out only the first name and price 50+ times. What am I missing? What would allow me to get it to show the next item? This is just a sample data where I base on the code.

My Code

import json
import requests

request = requests.get('http://example.com/json')

for item in request:
    data = request.json()
    data = data['items'][0]
    price = data['salePrice']
    name = data['name']
    print name

The Data

    {"items":[ {
  "itemId" : 5969538,
  "parentItemId" : 5969538,
  "name" : "Breakfast Nook 3 Piece Corner Dining Set, Black",
  "salePrice" : 288.99,
  "shortDescription" : "Create extra space and a cozy area to dine and relax with this stylish nook corner dining set. A rich black finish adds sophistication to any dining area, while the corner seats and additional bench provide comfortable seating for up to five people. Coordinate with your decor by adding colorful seating pads or pillows.<br><br><b>Product Details:</b><ul><li>Four piece set</li><li>Constructed of durable MDF</li><li>Rich, black finish</li><li>Includes two corner / wall nooks with seating, one table and one bench</li><li>Assembly required</li><li><b>Please note that all pieces are shipped separately.</b></li></ul>",
  "longDescription" : "<br><ul><li style="list-style: none"><b>Product Details:</b></li><li>Four piece set</li><li>Constructed of durable MDF</li><li>Rich, black finish</li><li>Includes two corner / wall nooks with seating, one table and one bench</li><li>Assembly required</li><li>Please do not use power tool for assembly</li><li><b>Please note that all pieces are shipped separately.</b></li><li>Dimensions for the Dining Set:</li><li>Longer Nook side - 63 1/2 x 20 x 34"H</li><li>Shorter Nook side - 48 x 20 x 34"H</li><li>Nook Table - 43 x 27 1/2 x 29"H</li><li>Nook Bench - 40 x 12 x 18"H</li></ul>",
  "thumbnailImage" : "http://i5.walmartimages.com/dfw/dce07b8c-9fb4/k2-_880ab0c8-ac73-4b5a-be2e-1cbd7692a65f.v1.jpg",
  "mediumImage" : "http://i5.walmartimages.com/dfw/dce07b8c-4173/k2-_b77791c6-a10b-494a-8243-f639c57e0284.v1.jpg",
  "largeImage" : "http://i5.walmartimages.com/dfw/dce07b8c-7add/k2-_d523b272-e4dd-4eb0-ab9b-d48c39d3fa2f.v1.jpg",
  "productTrackingUrl" : "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=http%253A%252F%252Fwww.walmart.com%252Fip%252FBreakfast-Nook-3-Piece-Corner-Dining-Set-Black%252F5969538%253Faffp1%253D%257Capk%257C%2526affilsrc%253Dapi",
  "ninetySevenCentShipping" : false,
  "color" : "Black",
  "marketplace" : false,
  "shipToStore" : false,
  "freeShipToStore" : false,
  "productUrl" : "http://c.affil.walmart.com/t/api00rb?l=http%3A%2F%2Fwww.walmart.com%2Fip%2FBreakfast-Nook-3-Piece-Corner-Dining-Set-Black%2F5969538%3Faffp1%3D%7Capk%7C%26affilsrc%3Dapi%26veh%3Daff%26wmlspartner%3Dreadonlyapi",
  "customerRating" : "2.88",
  "numReviews" : 1,
  "customerRatingImage" : "http://i2.walmartimages.com/i/CustRating/2_9.gif",
  "rollBack" : true,
  "bundle" : true,
  "clearance" : false,
  "stock" : "Not available",
  "addToCartUrl" : "http://c.affil.walmart.com/t/api00rb?l=http%3A%2F%2Faffil.walmart.com%2Fcart%2FaddToCart%3Fitems%3D5969538%7C1%26affp1%3D%7Capk%7C%26affilsrc%3Dapi%26veh%3Daff%26wmlspartner%3Dreadonlyapi",
  "affiliateAddToCartUrl" : "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=http%253A%252F%252Faffil.walmart.com%252Fcart%252FaddToCart%253Fitems%253D5969538%257C1%2526affp1%253D%257Capk%257C%2526affilsrc%253Dapi",
  "freeShippingOver50Dollars" : true,
  "availableOnline" : false
}, {
  "itemId" : 12321374,
  "parentItemId" : 12321374,
  "name" : "Castle Tent Loft Bed w/ Slide ; Under Bed Storage, Blue",
  "salePrice" : 369.01,
  "shortDescription" : "Finished in White powder coat with Blue and Red Microfiber fabric tent",
  "longDescription" : "Fun Castle Tent Bunk Bed with Slide includes a tent over twin bed and a covered hiding place below. The covered hiding place below can also be used as under bed storage. The top of the slide is tented with a tower with peek through, fold down window covers. <ul class="noindent"><li>Finished in White powder coat with Blue and Red Microfiber fabric tent, 100% polyester.</li><li>Uses a standard twin size mattress (sold separately).</li><li>Only use a twin size mattress that is 74-75" long and 37.5-38.5" wide.</li><li>Bunk bed is tested and certified by an independent testing laboratory to meet all minimum requirements of ASTM F1427-07 and U.S. CFR 1213 and 1513.</li><li>Some assembly required. 79-3/4" x 101-1/4" x 92" tall.</li></ul>",
  "brandName" : "Castle",
  "thumbnailImage" : "http://i5.walmartimages.com/dfw/dce07b8c-ea8c/k2-_de3d4207-5781-465c-8fd6-746ae39b7794.v1.jpg",
  "mediumImage" : "http://i5.walmartimages.com/dfw/dce07b8c-1bf5/k2-_2ba95697-6422-436a-a172-4060385cfa91.v1.jpg",
  "largeImage" : "http://i5.walmartimages.com/dfw/dce07b8c-919a/k2-_f9459e66-7a1f-4603-8531-3182b916612b.v1.jpg",
  "productTrackingUrl" : "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=http%253A%252F%252Fwww.walmart.com%252Fip%252FCastle-Tent-Loft-Bed-w-Slide-Under-Bed-Storage-Blue%252F12321374%253Faffp1%253D%257Capk%257C%2526affilsrc%253Dapi",
  "ninetySevenCentShipping" : false,
  "size" : "Twin",
  "color" : "Blue",
  "marketplace" : false,
  "shipToStore" : false,
  "freeShipToStore" : false,
  "productUrl" : "http://c.affil.walmart.com/t/api00rb?l=http%3A%2F%2Fwww.walmart.com%2Fip%2FCastle-Tent-Loft-Bed-w-Slide-Under-Bed-Storage-Blue%2F12321374%3Faffp1%3D%7Capk%7C%26affilsrc%3Dapi%26veh%3Daff%26wmlspartner%3Dreadonlyapi",
  "customerRating" : "4.574",
  "numReviews" : 54,
  "customerRatingImage" : "http://i2.walmartimages.com/i/CustRating/4_6.gif",
  "rollBack" : true,
  "bundle" : true,
  "clearance" : false,
  "stock" : "Not available",
  "gender" : "Boys",
  "addToCartUrl" : "http://c.affil.walmart.com/t/api00rb?l=http%3A%2F%2Faffil.walmart.com%2Fcart%2FaddToCart%3Fitems%3D12321374%7C1%26affp1%3D%7Capk%7C%26affilsrc%3Dapi%26veh%3Daff%26wmlspartner%3Dreadonlyapi",
  "affiliateAddToCartUrl" : "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=http%253A%252F%252Faffil.walmart.com%252Fcart%252FaddToCart%253Fitems%253D12321374%257C1%2526affp1%253D%257Capk%257C%2526affilsrc%253Dapi",
  "freeShippingOver50Dollars" : true,
  "availableOnline" : false
}, {
  "itemId" : 13241485,
  "parentItemId" : 13241485,
  "name" : "Extra Large Kitchen Cart, Black with Wood Top",
  "salePrice" : 235.0,
  "shortDescription" : "Add extra workspace and storage in your kitchen with this large kitchen cart. It features a natural wood top, two spacious drawers and a three-door storage cabinet with adjustable shelf.<br><br>This item ships in two separate boxes and may not arrive at the same time.",
  "longDescription" : "<br><ul><li>Large kitchen cart</li><li>Constructed of rubber wood, MDF and particle board</li><li>Natural wood top with black finish</li><li>2 utility drawers</li><li>3-door storage cabinet with adjustable shelf</li><li>Towel holder on side</li><li>Casters for mobility</li><li>Measures: 48''L x 18''W x 36''H</li><li>Model# 60048BLK</li></ul><br><b>Please note: This item ships in 2 boxes and each piece may arrive separately.</b>",
  "thumbnailImage" : "http://i5.walmartimages.com/dfw/dce07b8c-d920/k2-_bc669a17-f759-45c3-92ee-5650c01c5a03.v2.jpg",
  "mediumImage" : "http://i5.walmartimages.com/dfw/dce07b8c-9894/k2-_abd938ee-150f-423a-a0e9-16ce325facf2.v2.jpg",
  "largeImage" : "http://i5.walmartimages.com/dfw/dce07b8c-ff4f/k2-_1ea295f1-7480-4e86-8d5e-a516b4721f08.v2.jpg",
  "productTrackingUrl" : "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=http%253A%252F%252Fwww.walmart.com%252Fip%252FExtra-Large-Kitchen-Cart-Black-with-Wood-Top%252F13241485%253Faffp1%253D%257Capk%257C%2526affilsrc%253Dapi",
  "ninetySevenCentShipping" : false,
like image 524
turtle02 Avatar asked Apr 22 '16 17:04

turtle02


Video Answer


2 Answers

It's because of this line:

data = data['items'][0]

Here you have explicitly accessed that first item in each iteration of the loop.

Try this instead:

data = request.json()
items = data['items']

for item in items:
    price = item['salePrice']
    name = item['name']
    print name
like image 131
wim Avatar answered Oct 21 '22 02:10

wim


Wim is right. Your problem comes from the fact that you are trying to manipulate JSON data when the data is not JSON ready yet.

Below is a cleaner version of your code which calls a fake API that returns a list of 10 users.

The code will only use 2 libraries:

  1. json: this library will make sure our data us JSON ready (for python, I should mention) before we can iterate through it
  2. requests: this library will allow us to perform the http request to get the data back

Using just these two libraries, I can get my data with requests, make it JSON ready using json, loop through it with python using the for ... in ... statement, and print the content any way I want, like so:

# importing the necessary libraries
import json
import requests

# Making the http request
r = requests.get('https://jsonplaceholder.typicode.com/users')

# Transforming the data returned into JSON format
data = r.json()

# Construct various objects and variables to read the data
one_user = {}    
first_user = data[0]
first_user_name = data[0]['name']

print('The first user is:', first_user)
print('\n')
print('The first user s name is:', first_user_name)
print('\n')

for user in data:
    one_user['name'] = user['name']
    one_user['email'] = user['email']
    one_user['phone'] = user['phone']
    print(one_user)
    print('\n')

Data Sample

[
    {
        "id": 1,
        "name": "Leanne Graham",
        "username": "Bret",
        "email": "[email protected]",
        "address": {
        "street": "Kulas Light",
        "suite": "Apt. 556",
        "city": "Gwenborough",
        "zipcode": "92998-3874",
        "geo": {
            "lat": "-37.3159",
            "lng": "81.1496"
        }
        },
        "phone": "1-770-736-8031 x56442",
        "website": "hildegard.org",
        "company": {
            "name": "Romaguera-Crona",
            "catchPhrase": "Multi-layered client-server neural-net",
            "bs": "harness real-time e-markets"
        }
    },
    {...}
]

Screenshot of a working example on jupyter notebook

enter image description here

I hope this helps someone out there trying to solve this issue the right way.

like image 40
AllJs Avatar answered Oct 21 '22 02:10

AllJs