2017-06-02 61 views
0

我正在努力與urllib.request和unicode。我有一個獲取城市名稱列表的腳本,從它們構建geonames.org API請求URL並分析輸出的XML數據以完全按照我需要的方式顯示Geonames信息。只要城市名稱不包含任何非ASCII字符(如科隆的ö)(我必須使用德國城市名稱),該腳本就可以正常工作。urllib.request中的Unicode/Umlauts XML解析

# -*- coding: utf-8 -*- 
import urllib.request 
from xml.etree import ElementTree as ET 

urllist = [] 
citylist = ['Hamburg', 'Bremen'] 

for city in citylist: 
    requestURL = 'http://api.geonames.org/search?name=' + city + '&maxRows=1&lang=de&username=demo' 
    urllist.append(requestURL) 

for url in urllist: 
    root = ET.parse(urllib.request.urlopen(url)).getroot() 
    items = root.findall('geoname') 
    for item in items: 
     print(item.find('name').text + ', ' + item.find('countryName').text + ' [' + item.find('lat').text + ',' + item.find('lng').text + '] [id:' + item.find('geonameId').text + ']') 

。當切換HamburgKöln腳本退出並顯示錯誤消息UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 18: ordinal not in range(128)

另一件不起作用的地方是空白的城市名稱,如Bad Godesberg。我是否使用錯誤的方法來請求XML,或者是否在構建URL之前必須解碼我的城市名稱(對於雙字詞城市,我使用Bad%20Godesberg時它幾乎是絕對如此)?

感謝您的幫助!

回答

0

你必須使用urlencode,例如

的Python»文檔21.8.4. URL Quoting

下面是一個使用GET方法的例子會檢索包含參數的URL:
urllib-examples

>>> import urllib.request 
    >>> import urllib.parse 
    >>> params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0}) 
    >>> url = "http://www.musi-cal.com/cgi-bin/query?%s" % params 
    >>> with urllib.request.urlopen(url) as f: 
      print(f.read().decode('utf-8')) 
+0

感謝你們,我打算查看網址編碼!與此同時,我嘗試在Juypter筆記本中運行我的代碼,它在沒有任何我無法解釋但現在完美的變化的情況下運行。 – kbecker87