urllib.request中的Unicode /元音变换XML解析

时间:2017-06-02 06:59:21

标签: python unicode urllib

我正在努力使用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它的工作原理)?

感谢您的帮助!

1 个答案:

答案 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'))