我有一个存储在列表中的URL,应该传递给urllib2。但是,urllib似乎并不喜欢这个,我只是不明白为什么!
这是我得到的:
url = list[1]
response = urllib2.urlopen(url)
html = response.read()
该网址是Google地图路线Web API网址:
http://maps.googleapis.com/maps/api/directions/json?origin=[origin]&destination=[destination]&waypoints=optimize:true|[waypoint1]|[waypoint2]&sensor=false
现在,如果我尝试运行它,检索到的html总是看起来像这样:
{
"routes" : [],
"status" : "INVALID_REQUEST"
}
表明传递的URL有问题。但是,如果我使用URL并直接指定它,如下所示:
url = "http://maps.googleapis.com/maps/api/directions/json?origin=[origin]&destination=[destination]&waypoints=optimize:true|[waypoint1]|[waypoint2]&sensor=false"
response = urllib2.urlopen(url)
html = response.read()
结果将很高兴地通过(对我来说)基本终端部分看起来像这样:
"warnings" : [],
"waypoint_order" : [ 2, 0, 7, 5, 6, 4, 3, 1 ]
}
],
"status" : "OK"
}
因此,我的(希望不是太愚蠢)问题是:为什么urllib在直接分配URL时才能完成工作,但如果它来自列表则不行?
非常感谢你的帮助, Ĵ
PS:为什么论坛软件总是切断我的'大家好'的问候?
答案 0 :(得分:0)
我终于解决了这个问题!
一旦我退后一步再考虑一下,这很容易: 我确实从谷歌的Web API得到了答案,这意味着urllib2确实传递了的东西。但是,它必须发送一些对API后端没有任何意义的东西。包含德语地址的URL我很幸运地猜到问题是由变音符号引起的。
所以我只是简单地通过一个函数传递了我的URL,用一个非变音符替代每个变音符号,突然一切似乎都运行正常。
如果有人遇到类似的问题,我就是这样解决的:
# Function for replacing all umlauts
def replaceUmlauts(text):
dic = {'Ä':'Ae', 'ä':'ae', 'Ö':'Oe', 'ö':'oe', 'Ü':'Ue', 'ü':'ue', 'ß':'ss'}
for i, j in dic.iteritems():
text = text.replace(i, j)
return text
然后只需使用
response = urllib2.urlopen(replaceUmlauts(url))