2017-10-12 3 views
-1

Ich weiß, es wurde stark dokumentiert und ich habe versucht, die .read().decode('utf-8') überall wo ich denke, es sollte gehen, aber ich bin immer noch etwas fehlt und ich bin mir nicht sicher, wo sonst noch zu drehen. Ich habe ein Skript, das in Python 2.7 funktioniert, um ESRI-REST-URLs für Daten durch Abrufen der Objekt-IDs zu scrappen. In Python 3 scheint es jedoch nicht zu kooperieren. In Zeile 29 schlägt es kontinuierlich fehl (siehe unten). Jede Hilfe wäre sehr geschätzt.Python 3 Urlopen Probleme

 version = json.loads(webresp.decode('utf-8'))['currentVersion'] 

ich immer bin immer diesen Fehler konsequent:

Traceback (most recent call last): 
    File "<pyshell#20>", line 1, in <module> 
    main(url, jsonfilelocation, jsonfilename) 
    File "\\SERVER\Projects\Python\TOUCH\esrirestjson.py", line 73, in main 
    oids = ESRIJSON().getobjrange(webconn, path) 
    File "\\SERVER\Projects\Python\TOUCH\esrirestjson.py", line 29, in getobjrange 
    version = json.loads(webresp.decode('utf-8'))['currentVersion'] 
    File "C:\ArcGISPro\bin\Python\envs\arcgispro-py3\lib\json\__init__.py", line 312, in loads 
    s.__class__.__name__)) 
TypeError: the JSON object must be str, not 'bytes' 
+0

Können Sie Code hinzufügen, der das Beispiel der Klasse "ESRIJSON" darstellt? Ich kann definitiv die Antwort geben und den Code selbst schnell testen. Danke – jamescampbell

+0

Dein Fehler ist hier: ** version = json.loads (webresp.decode ('utf-8')) ['currentVersion'] ** Was hast du probiert? - Warum müssten Sie den ganzen Code dafür schreiben? –

+0

https://stackoverflow.com/questions/31708519/request-returns-bytes-and-im-failing-to-decode-them Vielleicht versuchen, .content hinzuzufügen? webconn.getresponse(). content –

Antwort

1

Ich habe Ihre Fehler behoben durch json.loads() zu json.load verändert und entfernt alle decode('utf-8'). Jetzt stoße ich auf einen anderen Fehler, weil Sie die Formatierung der Zeichenfolgen in Python 3 nicht richtig handhaben. Die qs Variablen müssen im Format "?where=&outFields=*&returnGeometry={} .format (Variable, die zu String hinzugefügt werden soll) gespeichert werden, was Tonnen von Sorgen über Codierungsprobleme spart. Ich bekomme immer noch ascii Fehler mit diesem qs String, aber hoffentlich zeigt Ihnen das in die richtige Richtung. Python 3 ist 10x besser als 2,7 und die Mühe wert.

+0

Interessant, wenn ich die 'json.loads()' entfernen und auf 'json.load()' umschreibe bekomme ich ein 'AttributeError: 'bytes' Objekt hat kein Attribut 'read''. –

+0

Entschuldigung. Entfernen Sie auch die .read(). Nicht notwendig auch nicht. Ich habe auch entfernt und habe vergessen, das in Antwort zu setzen. Sie können nach Druck (Version) testen und es funktioniert super oder sogar drucken (webresp) nach Ihnen json.load() es. Drucken Sie Ihre Daten immer so aus, wie Sie vorgehen, um zu sehen, mit was Sie es zu tun haben. – jamescampbell

+0

Nun, es ist ein 'AttributError' vom eigentlichen JSON-Modul. 'Datei" C: \ ArcGISPro \ bin \ Python \ envs \ arcgispro-py3 \ lib \ json \ __ init__.py ", Zeile 265, in load return Lasten (fp.read(),' –