谷歌 http://maps.google.com/maps/geo 使用非英文字符进行查询



我正在创建一个Python(使用urllib2)解析器,其中包含非英语字符的地址。目标是找到每个地址的坐标。

当我在火狐中打开这个网址时:

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

这是一个正确的结果。

但是,如果我在urllib2 (或 Opera 浏览器)中打开相同的 url(编码,使用 %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 %sn' % (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

我可以重现这种行为,起初我对为什么会发生这种情况感到目瞪口呆。仔细检查 wireshark 的 HTTP 请求后发现,Firefox 发送的请求(毫不奇怪)包含更多 HTTP-Headers。

最后,事实证明,Accept-Language标题产生了差异。只有在以下情况下才能获得正确的结果

  • 设置了Accept-Language标头
  • 并且它首先列出了非英语语言(优先级似乎并不重要)

因此,例如,此Accept-Language标头有效:

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

总而言之,像这样修改您的代码对我有用:

# -*- 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 %sn' % (url, data)

注意:在我看来,这是谷歌地理编码API中的一个错误。Accept-Language标头指示用户代理首选内容的语言,但它不应对请求的解释方式产生任何影响。

最新更新