Чтение XML-файла из URL-адреса в Python

Я использую проект с открытым исходным кодом под названием OpenTripPlanner, который представляет собой инструмент, который я планирую использовать для моделирования множества маршрутов из одной точки в другую в заданное время. До сих пор мне удалось найти URL-адрес, по которому находится файл XML, содержащий всю информацию о маршрутах. XML создается по запросу, поэтому URL-адрес не является статическим. URL-адрес выглядит примерно так:

http://localhost:8080/otp/routers/default/plan?fromPlace=48.40915,%20-71.04996&toPlace=48.41428,%20-71.06996&date=2017/12/04&time=8:00:00&mode=TRANSIT,WALK

(Чтобы открыть его, вам необходимо запустить сервер OpenTripPlanner)

Теперь я хочу прочитать эти файлы XML и выполнить некоторый анализ данных с помощью Python 3, но я не могу найти способ прочитать файлы. Я пытался использовать urllib.request для локальной загрузки файла, но файл, который я получаю, имеет странную форму. Это выглядит примерно так

{"requestParameters":{"дата":"2017/12/04","режим":"ТРАНЗИТ,ПРОГУЛКА","отместа":"48.40915, -71.04996","доместа":"48.41428, -71.06996", "время": "8:00:00"}, "план": {"дата": 1512392400000, "от": {"имя": "Происхождение", "долгота": -71.04996, "широта": 48.40915, "orig":"","vertexType":"NORMAL"},"to":{"name":"Destination","lon":-71.06996,"lat":48.41428,"orig":""," vertexType":"НОРМАЛЬНЫЙ"},"маршруты":[{"duration":1538,"startTime":1512392809000,"endTime":1512394347000,"walkTime":934,"transitTime":602,"waitingTime":2, "walkDistance": 1189.6595112715966, "walkLimitExceeded": false, "elevationLost": 0,0, "elevationGained": 0,0, "transfers": 0, "legs": [{"startTime": 1512392809000, "endTime": 1512393537000, "departureDelay" ":0,"arrivalDelay":0,"realTime":false,"distance":926.553,"pathway":false,"mode":"WALK","route":"","agencyTimeZoneOffset":-18000000, "interlineWithPreviousLeg":false,"from":{"name":"Origin","lon":-71.04996,"lat":48.40915,"departure":1512392809000,"orig":"","vertexType":" NORMAL"},"to":{"name":"Roitelets/Martinets","stopId" :"1:370","stopCode":"370","long":-71.047688,"lat":48.401531,"прибытие":1512393537000,"отправление":1512393538000,"stopIndex":15,"stopSequence": 16,"vertexType":"TRANSIT"},"legGeometry":{"points":"s{mfHb{spL|ExBp@sDl@V@@lB|@j@FL?j@GbCk@|A]vEsA^ KBA|C{@pCeACS~CuA`@Q","length":19},"rentedBike":false,"transitLeg":false,"duration":728,0,"steps":[{"distance":131,991, "relativeDirection":"DEPART","streetName":"Rue D.-V.-Morrier","absoluteDirection":"ЮГ","stayOn":false,"area":false,"bogusName":false," lon":-71.04961760502248,"lat":48.4090671692228,"высота":[]},{"distance":72.319,"relativeDirection":"LEFT","streetName":"Rue Lorenzo-Genest","absoluteDirection": «ВОСТОК», «stayOn»: false, «area»: false, «bogusName»: false, «lon»: -71.0502299, «широта»: 48.4079519, «высота»: []}

И когда я пытаюсь открыть файл в браузере, я получаю сообщение об ошибке

XML Parsing Error: not well-formed
Location: http://localhost:63342/XML_reader/file.xml?_ijt=e1d6h53s4mh1ak94sqortejf9v
Line Number 1, Column 1: ...

Сценарий, который я использую, очень прост, он выглядит так

import urllib.request

testfile = urllib.request.URLopener()
file_name = 'http://localhost:8080/otp/routers/default/plan?fromPlace=48.40915,%20-71.04996&toPlace=48.41428,%20-71.06996&date=2017/12/04&time=8:00:00&mode=TRANSIT,WALK'
testfile.retrieve(file_name, "file.xml")

Как я могу сделать выходные файлы XML правильно сформированными? Есть ли другой способ, кроме urllib.request, который я могу попробовать?

Большое спасибо


person olivierhsta    schedule 23.01.2018    source источник
comment
Это не xml, а json....   -  person MegaIng    schedule 24.01.2018
comment
Ответ не является документом в формате XML, это данные JSON.   -  person F.Igor    schedule 24.01.2018
comment
По умолчанию OTP отвечает в формате json. Возможно, если вы измените Content-Type вашего запроса на xml (Application/xml? Не знаю, как это сделать, поскольку я не веб-эксперт)   -  person CristiFati    schedule 24.01.2018


Ответы (1)


Чтобы импортировать этот файл как данные JSON (не XML), вам нужна библиотека JSON.

import urllib.request
import json
from pprint import pprint

testfile = urllib.request.URLopener()
file_name = 'http://localhost:8080/otp/routers/default/plan?fromPlace=48.40915,%20-71.04996&toPlace=48.41428,%20-71.06996&date=2017/12/04&time=8:00:00&mode=TRANSIT,WALK'
testfile.retrieve(file_name, "file.json")

data = json.load(open('file.json'))
pprint(data)
person F.Igor    schedule 23.01.2018
comment
Спасибо! Это была именно проблема ... Я чувствую себя немного глупо, не зная, что это был JSON, лол ... В любом случае, спасибо, что нашли время, чтобы объяснить мне это! - person olivierhsta; 24.01.2018