2017-06-02 30 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