我正在努力使用urllib.request和unicode。我有一个脚本,它获取城市名称列表,从中构建geonames.org API请求URL并解析输出XML数据以完全按照我需要的方式显示地理名称信息。只要城市名称不包含任何像科隆中的ö非ASCII字符(我必须使用德语城市名称),该脚本才能正常工作。
# -*- 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
它的工作原理)?
感谢您的帮助!
答案 0 :(得分: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'))