首页 > 解决方案 > 使用 Python 使用特定关键字解析 JSON

问题描述

我正在尝试解析网站股票的 JSON。

JSON:https ://www.ssense.com/en-us/men/sneakers.json

所以我想从用户那里获取一些关键词。然后我想使用这些关键字解析 JSON 以查找项目的名称并(在这种特定情况下)返回 ID、SKU 和 URL。

例如:如果我输入“Black Fennec”,我想解析 JSON 并找到 Black Fennec Sneakers 的 ID、SKU 和 URL(ID 为 3297299,SKU 为 191422M237006,url 为 /men/产品/ps-paul-smith/black-fennec-sneakers/3297299)

我从来没有尝试过做这样的事情。基于一些显示如何解析 JSON 的指南,我从以下内容开始:

r = requests.Session()
stock = r.get("https://www.ssense.com/en-us/men/sneakers.json",headers = headers)
obj json_data = json.loads(stock.text)

然而我现在很困惑。如何根据关键字找到产品,以及如何获取 ID、Url 和 SKU 或它?

标签: pythonjsonpython-3.xpython-requests

解决方案


有多种方法可以处理输出。不知道你想用它做什么。但这应该让你继续前进。

编辑1:

import requests

r = requests.Session()
obj_json_data = r.get("https://www.ssense.com/en-us/men/sneakers.json").json()

products = obj_json_data['products']


keyword = input('Enter a keyword: ')

for product in products:
    if keyword.upper() in product['name'].upper():
        name = product['name']
        id_var = product['id']
        sku = product['sku']
        url = product['url']
        print ('Product: %s\nID: %s\nSKU: %s\nURL: %s' %(name, id_var, sku, url))
        # if you only want to return the first match, uncomment next line
        #break

我还设置了将其存储到数据框和/或列表中。只是为了提供一些选择去哪里。

import requests
import pandas as pd

r = requests.Session()
obj_json_data = r.get("https://www.ssense.com/en-us/men/sneakers.json").json()

products = obj_json_data['products']



keyword = input('Enter a keyword: ')

products_found = []
results = pd.DataFrame()
for product in products:
    if keyword.upper() in product['name'].upper():
        name = product['name']
        id_var = product['id']
        sku = product['sku']
        url = product['url']
        temp_df = pd.DataFrame([[name, id_var, sku, url]], columns=['name','id','sku','url'])
        results = results.append(temp_df)
        products_found = products_found.append(name)
        print ('Product: %s\nID: %s\nSKU: %s\nURL: %s' %(name, id_var, sku, url))

if products_found == []:
    print ('Nothing found')

编辑 2:这是另一种方法,将 json 转换为数据框,然后按名称中包含关键字的行进行过滤(在我看来,这实际上是一个更好的解决方案)

import requests
import pandas as pd
from pandas.io.json import json_normalize

r = requests.Session()
obj_json_data = r.get("https://www.ssense.com/en-us/men/sneakers.json").json()

products = obj_json_data['products']
products_df = json_normalize(products)

keyword = input('Enter a keyword: ')

products_found = []
results = pd.DataFrame()

results = products_df[products_df['name'].str.contains(keyword, case = False)]
#print (results[['name', 'id', 'sku', 'url']])

products_found = list(results['name'])
if products_found == []:
    print ('Nothing found')
else:
    print ('Found: '+ str(products_found))

推荐阅读