我正在努力與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 + ']')
。當切換Hamburg
與Köln
腳本退出並顯示錯誤消息UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 18: ordinal not in range(128)
。
另一件不起作用的地方是空白的城市名稱,如Bad Godesberg
。我是否使用錯誤的方法來請求XML,或者是否在構建URL之前必須解碼我的城市名稱(對於雙字詞城市,我使用Bad%20Godesberg
時它幾乎是絕對如此)?
感謝您的幫助!
感謝你們,我打算查看網址編碼!與此同時,我嘗試在Juypter筆記本中運行我的代碼,它在沒有任何我無法解釋但現在完美的變化的情況下運行。 – kbecker87