我正在努力与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