2014-02-11 9 views
5

Ich versuche, Antwort von Nominatatim Geo-Code einige Tausende von Städten zu erhalten.Xml Parsing von Web-Antwort

import os 
import requests 
import xml.etree.ElementTree as ET 

txt = open('input.txt', 'r').readlines() 
for line in txt: 
lp, region, district, municipality, city = line.split('\t') 
baseUrl = 'http://nominatim.openstreetmap.org/search/gb/'+region+'/'+district+'/'+municipality+'/'+city+'/?format=xml' 
# eg. http://nominatim.openstreetmap.org/search/pl/podkarpackie/stalowowolski/Bojan%C3%B3w/Zapu%C5%9Bcie/?format=xml 
resp = requests.get(baseUrl) 
resp.encoding = 'UTF-8' # special diacritics 
msg = resp.text 
# parse response to get lat & long 
tree = ET.parse(msg) 
root = tree.getroot() 
print tree 

aber das Ergebnis ist:

Traceback (most recent call last): 
File "geo_miasta.py", line 17, in <module> 
    tree = ET.parse(msg) 
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1182, in parse 
    tree.parse(source, parser) 
File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 647, in parse 
    source = open(source, "rb")  
IOError: [Errno 2] No such file or directory: u'<?xml version="1.0" encoding="UTF-8" ?>\n<searchresults timestamp=\'Tue, 11 Feb 14 21:13:50 +0000\' attribution=\'Data \xa9 OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright\' querystring=\'\u015awierczyna, Drzewica, opoczy\u0144ski, \u0142\xf3dzkie, gb\' polygon=\'false\' more_url=\'http://nominatim.openstreetmap.org/search?format=xml&amp;exclude_place_ids=&amp;q=%C5%9Awierczyna%2C+Drzewica%2C+opoczy%C5%84ski%2C+%C5%82%C3%B3dzkie%2C+gb\'>\n</searchresults>' 

Was mit diesem falsch?

Edit: Thant meine Lösung @ Rob ist:

#! /usr/bin/env python2.7 
# -*- coding: utf-8 -*- 

import os 
import requests 
import xml.etree.ElementTree as ET 

txt = open('input.txt', 'r').read().split('\n') 

for line in txt: 
    lp, region, district, municipality, city = line.split('\t') 
    baseUrl = 'http://nominatim.openstreetmap.org/search/pl/'+region+'/'+district+'/'+municipality+'/'+city+'/?format=xml' 
    resp = requests.get(baseUrl) 
    msg = resp.content 
    tree = ET.fromstring(msg) 
    for place in tree.findall('place'): 
    location = '{:5f}\t{:5f}'.format(
     float(place.get('lat')), 
     float(place.get('lon'))) 

    f = open('result.txt', 'a') 
    f.write(location+'\t'+region+'\t'+district+'\t'+municipality+'\t'+city) 
    f.close() 

Antwort

6

Du xml.etree.ElementTree.parse() verwenden, die einen Dateinamen oder ein Dateiobjekt als Argument. Übergeben Sie jedoch keine Datei oder ein Dateiobjekt, übergeben Sie eine Unicode-Zeichenfolge.

Versuchen Sie xml.etree.ElementTree.fromstring(text).

So:

tree = ET.fromstring(msg) 

Hier ist ein komplettes Beispielprogramm:

import os 
import requests 
import xml.etree.ElementTree as ET 

baseUrl = 'http://nominatim.openstreetmap.org/search/pl/podkarpackie/stalowowolski/Bojan%C3%B3w/Zapu%C5%9Bcie\n/?format=xml' 
resp = requests.get(baseUrl) 
msg = resp.content 
tree = ET.fromstring(msg) 
for place in tree.findall('place'): 
    print u'{:s}: {:+.2f}, {:+.2f}'.format(
    place.get('display_name'), 
    float(place.get('lon')), 
    float(place.get('lat'))).encode('utf-8') 
+0

Danke, das die Fehlergrenze der Codierung Raum bewegen: 'UnicodeEncodeError: 'ascii' Codec‘ t codiere das Zeichen u '\ xa9' an der Stelle 115: ordinal nicht im Bereich (128) ' – m93

+0

@ m93 - Das liegt daran, dass du' resp.text' anstelle von 'resp.content' verwendest. Sehen Sie meine Bearbeitung für ein komplettes Programm, das Ihnen den Einstieg erleichtern sollte. –

+0

Sie haben Recht. Dieses Beispiel funktioniert. Vielen Dank. – m93

0
import os,sys,time 
import xml.etree.ElementTree as ET 
from xml.etree.ElementTree import parse 
tree = ET.parse('D:\Reddy\BankLoanAcctService_transactionInq.xml') 
root=tree.getroot() 

for TrxnEffDt in root.iter('TrxnEffDt'): 
new_TrxnEffDt= str(time.strftime("%y-%m-%d")) 
TrxnEffDt=str(new_TrxnEffDt) 

filename2 ="D:\Reddy\BankLoanAcctService_transactionInq2.txt" 
r=open(filename2,'w') 
sys.stdout =r 
+0

Traceback (letzter Anruf zuletzt): Datei "D: \ Reddy \ Python \ new.py", Zeile 4, in tree = ET.parse ('D: \ Reddy \ BankLoanAcctService_transactionInq.xml') File " C: \ Python33 \ lib \ xml \ etree \ ElementTree.py ", Zeile 1242, im Parser tree.parse (Quelle, Parser) Datei" C: \ Python33 \ lib \ xml \ etree \ ElementTree.py ", Zeile 1730, in Parse self._root = parser._parse (Quelle) File "", line Keine xml.etree.ElementTree.ParseError: Syntaxfehler: Zeile 1, Spalte 0 – user5493252

+0

Dies ist die Fehlermeldung ich erhalte. Bitte helfen Sie mir – user5493252

+0

Sie sollten wahrscheinlich Ihre eigene Frage statt eine Antwort zu diesem Thema (um Verwirrung zu vermeiden und sicher sein, eine Lösung für Ihr spezifisches Problem zu erhalten), und wenn Sie denken, dass das Problem verwandt ist, sollten Sie ein Link zu diesem, um den Beantwortern zu helfen. – Tiesselune