2014-02-11 53 views
5

我试图从nominatim到geo-code几千个城市得到响应。Xml从网络响应中解析

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 

但结果是:

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>' 

有什么不对呢?

编辑: 吴丹到@rob我的解决方案是:

#! /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() 

回答

6

您正在使用xml.etree.ElementTree.parse(),这需要一个文件名或文件对象作为参数。但是,您不传递文件或文件对象,您传递的是unicode字符串。

尝试xml.etree.ElementTree.fromstring(text)

像这样:

tree = ET.fromstring(msg) 

下面是一个完整的示例程序:

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

谢谢,这个移动的错误边境编码空间:'UnicodeEncodeError: 'ASCII' 编解码器” t在位置115编码字符u'\ xa9':序号不在范围内(128)' – m93

+0

@ m93 - 这是因为您正在使用'resp.text'而不是'resp.content'。看到我的编辑完整的程序,应该让你开始。 –

+0

你说得对。这个示例有效。谢谢。 – 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

回溯(最近一次调用最后一次): 文件“D:\ Reddy \ Python \ new.py”,第4行,在 tree = ET.parse('D:\ Reddy \ BankLoanAcctService_transactionInq.xml') File“ C:\ Python33 \ lib \ xml \ etree \ ElementTree.py“,行1242,解析为 tree.parse(source,parser) 文件”C:\ Python33 \ lib \ xml \ etree \ ElementTree.py“ 1730,in parse self._root = parser._parse(source) 文件“”,行无 xml.etree.ElementTree.ParseError:语法错误:行1,列0 – user5493252

+0

这是我收到的错误消息。请帮助我 – user5493252

+0

您应该问自己的问题,而不是使用关于此主题的答案(以避免混淆,并确保为您的具体问题找到解决方案),并且,如果您认为问题是相关的,则应该将链接到这个帮助回答者。 – Tiesselune