2012-09-27 21 views
3

我使用非英文字符創建Python(使用urllib2)地址的解析器。目標是找到每個地址的座標。Google http://maps.google.com/maps/geo使用非英文字符查詢

當我在火狐打開該URL:

http://maps.google.com/maps/geo?q=Czech%20Republic%2010000%20Male%C5%A1ice&output=csv 

它被轉換(在地址框改變)

http://maps.google.com/maps/geo?q=Czech Republic 10000 Malešice&output=csv 

並返回

200,6,50.0865113,14.4918052 

這是一個正確結果。

然而,如果我打開相同的URL在urllib2(或Opera瀏覽器)(編碼,用20%和等),結果是

200,4,49.7715220,13.2955410 

這是不正確。如何打開urllib2中的第一個網址以獲得「200,6,50.0865113,14.4918052」結果?

編輯:

代碼使用

import urllib2 

psc = '10000' 
name = 'Malešice' 
url = 'http://maps.google.com/maps/geo?q=%s&output=csv' % urllib2.quote('Czech Republic %s %s' % (psc, name)) 

response = urllib2.urlopen(url) 
data = response.read() 

print 'Parsed url %s, result %s\n' % (url, data) 

輸出

Parsed url http://maps.google.com/maps/geo?q=Czech%20Republic%2010000%20Male%C5%A1ice&output=csv, result 200,4,49.7715220,13.2955410

+1

請問您可以使用urllib2.open指定確切的代碼行嗎? – sergzach

+0

可能的重複:[使用python編碼URL的百分比](http://stackoverflow.com/questions/12114853/percent-encoding-url-with-python/12114958)(用於Google Maps API)。 –

回答

1

我可以重現此問題,並在第一次我就傻眼了,爲什麼它的發生。使用wireshark進一步檢查HTTP請求表明,Firefox發送的請求(不奇怪)包含多個HTTP頭。

最後事實證明,這是Accept-Language標題,使差異。你只得到,如果

  • Accept-Language頭設置
  • 它有第一家上市的非英語語言正確的結果(優先級似乎並不重要)

所以,例如該Accept-Language頭的工作原理:

headers = {'Accept-Language': 'de-ch,en'} 

總之,修改你這樣的代碼WO我RKS:

# -*- coding: utf-8 -*- 
import urllib2 

psc = '10000' 
name = 'Malešice' 
url = 'http://maps.google.com/maps/geo?q=%s&output=csv' % urllib2.quote('Czech Republic %s %s' % (psc, name)) 
headers = {'Accept-Language': 'de-ch,en'} 

req = urllib2.Request(url, None, headers) 
response = urllib2.urlopen(req) 
data = response.read() 

print 'Parsed url %s, result %s\n' % (url, data) 

注意:在我看來,這是在谷歌的地理編碼API的錯誤。 Accept-Language標題指示用戶代理首選哪種語言的內容,但不應該對請求的解釋方式產生任何影響。