用python从JSON中获取web数据

2024-06-01 03:40:34 发布

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

我想从this API获取时刻表数据。返回的数据是JSON格式的。我用的是python。在

我尝试了以下代码:

snav_timetable_url = "https://booking.snav.it/api/v1/rates/1040/2019-02-25/1042/2019-02-25?lang=1"
fh = urllib.request.urlopen(snav_timetable_url)
snav_timetable = fh.read().decode('utf-8')
fh.close()
snav_timetable_data = json.loads(snav_timetable[len(snav_timetable)-2])
snav_timetable_data_cleaned = []
for departure in snav_timetable_data ['data']['ratesOutward']:
    snav_timetable_data_cleaned.append({
       'COMPANY': 'Snav',
       'CODICE CORSA': departure['coditinera'],
       'DEPARTURE DATE TIME': departure['strDatapart'],
       'ARRIVAL DATE TIME': departure['strDatarri']
    })

但会出错

^{pr2}$

我做错什么了?在


Tags: 数据apijsonurldatadatetime格式
3条回答

您的错误是试图从响应中解码单个字符:

>>> snav_timetable[len(snav_timetable)-2]
'}'

单个字符不是JSON文档,因此正确地说,解析失败。你想解码整个回答:

^{pr2}$

您可能希望切换到使用^{} library而在这里,它使来自API的loading JSON responses变得微不足道:

import requests

snav_timetable_data = requests.get(snav_timetable_url).json()

snav_timetable_data_cleaned = []
for departure in snav_timetable_data['data']['ratesOutward']:
    snav_timetable_data_cleaned.append({
       'COMPANY': 'Snav',
       'CODICE CORSA': departure['coditinera'],
       'DEPARTURE DATE TIME': departure['strDatapart'],
       'ARRIVAL DATE TIME': departure['strDataarri']
    })

注意,我必须更正arrival date time引用中的一个错误;它是strDataarri,而不是{}。在

你把strdatarri拼错了。在

此外,请求库可能会使它看起来更干净。在

import requests
snav_timetable_url = "https://booking.snav.it/api/v1/rates/1040/2019-02-25/1042/2019-02-25?lang=1"
r = requests.get(snav_timetable_url).json()

snav_timetable_data_cleaned = []
for departure in r['data']['ratesOutward']:
    snav_timetable_data_cleaned.append({
       'COMPANY': 'Snav',
       'CODICE CORSA': departure['coditinera'],
       'DEPARTURE DATE TIME': departure['strDatapart'],
       'ARRIVAL DATE TIME': departure['strDataarri']
    })

输出:

^{pr2}$

如果您使用的是python3.x,最好使用requests库。在

import requests

snav_timetable_url = "https://booking.snav.it/api/v1/rates/1040/2019-02-25/1042/2019-02-25?lang=1"
fh = requests.get(snav_timetable_url)
json_data = fh.json()

这样就不会有任何错误,可以继续解析。在

^{pr2}$

相关问题 更多 >