首页 > 解决方案 > 错误列表索引必须是整数或切片,而不是 str 当 formattig json

问题描述

运行此 python 脚本时出现以下错误:

for departure in snav_live_departures_data ['data']['departures']:
TypeError: list indices must be integers or slices, not str

这是代码

ximport urllib.request
from bs4 import BeautifulSoup
import json

def cleanText( text ):
    return text.lower().capitalize()

#Snav - live departure
api_url = "https://booking.snav.it/api/v1/dashboard/nextDepartures?callback=jQuery12345&_=12345"
fh = urllib.request.urlopen(api_url)
snav_live_departures_table = fh.read().decode('utf-8')
fh.close()
snav_live_departures_data = json.loads(snav_live_departures_table[16:len(snav_live_departures_table)-2])
print(snav_live_departures_data)
snav_live_departures_data = []
for departure in snav_live_departures_data ['data']['departures']:
    snav_live_departures_data.append({
        "DEPARTURE DATE": departure['departureDate'], 
        "ARRIVAL DATE": departure['arrivalDate'],
        "DEPARTURE PORT": cleanText( departure['departurePort'] ),
        "ARRIVAL PORT": cleanText( departure['arrivalPort'] ),
        "STATUS": "suspended" if departure['is_suspended'] else "active"
    })
with open('snav_live_departures.json', 'w') as outfile:
  json.dump(snav_live_departures, outfile)

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

{"success": "OK", "message": "DEPARTURES_FOUND", "data": {"departures": [{"id": 58490, "itinerary_id": 1152, "codcorsa": "CMCA1812280640NG", "ship_description": "Fast Ferry", "delay": null, "is_suspended": null, "notes": null, "type_id": 1, "departurePort": "C/MARE", "arrivalPort": "CAPRI", "departureDate": "2018-12-28 06:40", "arrivalDate": "2018-12-28 07:35"}, {"id": 58471, "itinerary_id": 1148, "codcorsa": "NACA1812280700NS", "ship_description": "Fast Ferry", "delay": null, "is_suspended": null, "notes": null, "type_id": 1, "departurePort": "NAPOLI BEVERELLO", "arrivalPort": "CAPRI", "departureDate": "2018-12-28 07:00", "arrivalDate": "2018-12-28 07:50"},...

标签: pythonjson

解决方案


snav_live_departures_data = []

您正在覆盖导入的 JSON 数据。

这意味着当您使用

snav_live_departures_data['data']['departures']

要访问数据,您实际上是在尝试访问[]. 这显然会导致上述错误。


推荐阅读