谷歌http://maps.google.com/maps/geo查询非英文字符(Google ht

2019-09-23 02:38发布

我创建一个Python(使用urllib2地址与它非英文字符)语法分析器。 我们的目标是要找到每一个地址的坐标。

当我在Firefox中打开这个网址:

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(编码,用20%和等)在urllib2 (或Opera浏览器),其结果是

200,4,49.7715220,13.2955410

这是不正确 。 我怎样才能在打开第一个URL 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

Answer 1:

我可以重现此问题,并在第一次我就傻眼了,为什么它的发生。 与HTTP请求的仔细检查Wireshark的显示,Firefox浏览器(这并不奇怪)发送的请求包含一对夫妇更多的HTTP报头。

最终事实证明它是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 %s\n' % (url, data)

:在我看来,这是在谷歌的地理编码API的错误。 在Accept-Language头指示哪种语言的用户代理喜欢的内容,但它不应该对如何解读要求任何影响。



文章来源: Google http://maps.google.com/maps/geo query with non-english characters