python从json获取正确信息的问题

2024-09-28 20:53:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有问题,然后我尝试从正确的信息。 例如,在我在post中发出请求后,我有非常大的json输出(我不能使用get)

 "offers": [
    {
        "rank": 1,
        "provider": {
            "id": 6653,
            "isLocalProvider": false,
            "logoUrl": "https://img.vxcdn.com/i/partner-energy/c_6653.png?v=878adaf9ed",
            "userRatings": {
                "additonalCustomerRatings": {
                    "price": {
                        "percent": 73.80
                    },
                    "service": {
                        "percent": 67.50
                    },
                    "switching": {
                        "percent": 76.37
                    },
                    "caption": {
                        "text": "Zusätzliche Kundenbewertungen"
                    }
                },

我不能全部展示,因为它很大。 正如您所看到的"rank" 1在这个请求中存在20个级别,其中包含contenttotalCost等信息,我需要将它们全部挑选出来。比如{}和{},{}和{}

首先,在python中,我使用代码获取json数据

import requests
import json


url = "https://www.verivox.de/api/energy/offers/electricity/postCode/10555/custom?"

payload="{\"profile\":\"H0\",\"prepayment\":true,\"signupOnly\":true,\"includePackageTariffs\":true,\"includeTariffsWithDeposit\":true,\"includeNonCompliantTariffs\":true,\"bonusIncluded\":\"non-compliant\",\"maxResultsPerPage\":20,\"onlyProductsWithGoodCustomerRating\":false,\"benchmarkTariffId\":741122,\"benchmarkPermanentTariffId\":38,\"paolaLocationId\":\"71085\",\"includeEcoTariffs\":{\"includesNonEcoTariffs\":true},\"maxContractDuration\":240,\"maxContractProlongation\":240,\"usage\":{\"annualTotal\":3500,\"offPeakUsage\":0},\"priceGuarantee\":{\"minDurationInMonths\":0},\"maxTariffsPerProvider\":999,\"cancellationPeriod\":null,\"previewDisplayTime\":null,\"onlyRegionalTariffs\":false,\"sorting\":{\"criterion\":\"TotalCosts\",\"direction\":\"Ascending\"},\"includeSpecialBonusesInCalculation\":\"None\",\"totalCostViewMode\":1,\"ecoProductType\":0}"
headers = {
  'Content-Type': 'application/json',
  'Cookie': '__cfduid=d97a159bb287de284487ebdfa0fd097b41606303469; ASP.NET_SessionId=jfg3y20s31hclqywloocjamz; 0e3a873fd211409ead79e21fffd2d021=product=Power&ReturnToCalcLink=/power/&CustomErrorsEnabled=False&IsSignupWhiteLabelled=False; __RequestVerificationToken=vrxksNqu8CiEk9yV-_QHiinfCqmzyATcGg18dAqYXqR0L8HZNlvoHZSZienIAVQ60cB40aqfQOXFL9bsvJu7cFOcS2s1'
}

response = requests.request("POST", url, headers=headers, data=payload)

jsondata = response.json()

# print(response.text)

因为它工作得很好,但是我试着挑选一些我需要的数据,就像我在得到之前说的那样

    for Rankdata in str(jsondata['rank']):
KeyError: 'rank'

我的错误代码

dataRank = []

for Rankdata in str(jsondata['rank']):
   dataRank.append({
     'tariff':Rankdata['content'],
     'cost': Rankdata['totalCost'],
     'sumOfOneTimeBonuses': Rankdata['content'],
     'savings': Rankdata['content']
     })

然后我试着用另一种方法。只需获取一个或一些数据,但不能工作太多

data = response.json()
#print(data)
test = float((data['rank']['totalCost']['content']))

我知道我的代码并不完美,但我第一次处理了json如此大和如此困难的问题。如果在我的例子中展示我如何挑选排名1-20的数据并打印出来,我将非常感激

谢谢你的帮助


Tags: 数据信息jsonfalsetruedataresponsecontent
1条回答
网友
1楼 · 发布于 2024-09-28 20:53:39

如果仔细查看json中的最高级别,可以看到keyoffers的值是一个dict列表。因此,您可以这样循环:

for offer in jsondata['offers']:
  print(offer.get('rank'))
  print(offer.get('provider').get('id'))

优惠中的其他钥匙也是如此

相关问题 更多 >