3

英語以外の文字を含むアドレスのPython(を使用urllib2)パーサーを作成しています。目標は、すべての住所の座標を見つけることです。

Firefoxでこの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

これは正しい結果です。

urllib2ただし、 (またはOperaブラウザ)で同じURL(エンコードされた%20など)を開くと、結果は次のようになります。

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

4

1 に答える 1

1

私はこの振る舞いを再現することができます、そして最初はそれが起こっている理由について私は唖然としました。wiresharkを使用してHTTPリクエストを詳しく調べると、Firefoxによって送信されたリクエストには(当然のことながら)さらに2、3の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)

:私の意見では、これはGoogleのジオコーディングAPIのバグです。ヘッダーは、Accept-Languageユーザーエージェントがコンテンツを好む言語を示しますが、リクエストの解釈方法には影響しません。

于 2012-09-27T17:23:43.830 に答える