2017-06-02 19 views
0

私はurllib.requestとunicodeで苦労しています。都市名のリストを取得し、そこからgeonames.org APIリクエストURLを作成し、出力XMLデータを解析して必要な方法で正確にジオネーム情報を表示するスクリプトがあります。このスクリプトは、都市名にKölnのöのような非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 + ']') 

私はKölnHamburgを切り替えると、スクリプトはエラーメッセージUnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 18: ordinal not in range(128)で終了します。

もう1つ動作しないことは、都市名が空白の場合、Bad Godesbergのようになります。私は間違った方法を使ってXMLをリクエストしていますか、URLを作成する前に市の名前をデコードする必要がありますか(Bad%20Godesbergのように2単語都市の場合はほぼ間違いありません)?

ありがとうございました!あなたはurlencodeを使用する必要が

答えて

0

、例えば

のPython»ドキュメントここ21.8.4. URL Quoting

は、パラメータを含むURLを取得するために、GETメソッドを使用してセッション例です:
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

ありがとうございます、私はURLを調べるつもりですエンコード!その間、私はJuypterノートブックで自分のコードを実行しようとしましたが、私は説明できない変更は一切しませんが、今は完璧です。 – kbecker87