2014-02-11 2 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>' 

Что не так с этим?

Edit: Тан @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(), который принимает имя файла или объект файла в качестве аргумента. Но вы не передаете файл или файловый объект, вы передаете строку юникода.

Пробег: 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 кодировать символ u '\ xa9' в позиции 115: порядковый номер не в диапазоне (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

Traceback (самый последний вызов последнего): Файл "D: \ Reddy \ Python \ new.py", строка 4, в дерева = ET.parse ('D: \ Reddy \ BankLoanAcctService_transactionInq.xml') Файл " C: \ Python33 \ lib \ xml \ etree \ ElementTree.py ", строка 1242, в разборке tree.parse (источник, парсер) Файл" C: \ Python33 \ lib \ xml \ etree \ ElementTree.py ", строка 1730, в синтаксический анализ self._root = parser._parse (источник) Файл "", строка None xml.etree.ElementTree.ParseError: синтаксическая ошибка: строка 1, столбец 0 – user5493252

+0

Это сообщение об ошибке я получаю. pls help me – user5493252

+0

Возможно, вы должны задать свой собственный вопрос вместо ответа на эту тему (во избежание путаницы и не забудьте получить решение своей конкретной проблемы), и если вы считаете, что проблема связана, вы должны ссылку на этот вопрос, чтобы помочь ответчикам. – Tiesselune

Смежные вопросы