无法获取Python从站点解析JSON

时间:2019-08-03 16:02:55

标签: python python-3.x

我正在尝试获取我的Python脚本来解析网站上特定json文件中的某些数据(价格),但无法使其正常工作。 它可以很好地提取整个页面,但不能仅仅提取某些数据。

这是我要从中提取数据的JSON:

[{
    "id": 1696146,
    "name": "Genos",
    "photo_url": "https://hobbydb-production.s3.amazonaws.com/processed_uploads/collectible_photo/collectible_photo/image/324461/1556082253-24867-7610/Genos_Vinyl_Art_Toys_60fb245b-1af9-4ad1-a5a2-c90d3e8291a6_medium.jpg",
    "preorder": false,
    "price": "$40.00",
    "price_after_discount": "$40.00",
    "seller_username": "BatmanPajamas",
    "url": "https://www.hobbydb.com/marketplaces/2/cart/1696146"
}]

这是我得到的代码,可让我获取整个json:

import urllib.request, json 
withurllib.request.urlopen("https://www.hobbydb.com/api/collectibles/for_sale_search?limit=5&original_site_id=10748&market_id=2") as url:
    data = json.loads(url.read().decode())
    print(data)

我尝试了各种代码,但是每次得到:

TypeError: list indices must be integers or slices, not str

有什么想法我可以从这个JSON解析价格吗?

3 个答案:

答案 0 :(得分:0)

外部方括号([])表示响应返回项目列表。因此,您需要遍历列表的索引,然后然后可以访问您要访问的内容。这是我使用requests

的方法
import requests

resp = requests.get("https://www.hobbydb.com/api/collectibles/for_sale_search?limit=5&original_site_id=10748&market_id=2")

#requests has built-in support for json, so no need to import json module
for product in resp.json():
    print(product["price"])

答案 1 :(得分:0)

要遍历json数组:

for item in data:
    for keys in item.keys():
        print(item[keys])

仅显示价格

for item in data:
    print(item['price'])

答案 2 :(得分:0)

我认为您遇到的问题是因为此JSON对象以数组开头(一旦将其加载为Python对象,它将是一个列表)。首先,您需要使用标准库中的json库。然后,您必须使用列表索引然后使用dict键访问对象。

尝试一下:

import urllib.request, json 
with urllib.request.urlopen("https://www.hobbydb.com/api/collectibles/for_sale_search?limit=5&original_site_id=10748&market_id=2") as url:
    data = json.loads(url.read().decode())
    print(data)
    toy = data[0]
    price = toy['price']

此外,请记住,with关键字创建了一个用于解析JSON数据的上下文,因此一旦脚本移至该上下文之外的代码,您将无法访问{{1 }}变量,因此您可能需要将该值分配或设置为在该上下文之外创建的另一个变量。