Python中的编码 - 将非英语字符转换为URL
我正在一点一点地写一个地理编码的脚本。这里有一个丹麦的(官方且免费的)网络服务,我可以在网址中输入一个地址,然后得到一个包含所有必要信息的json文件。
我找不到正确的方法来处理我的丹麦字符(æ, ø, å)在网址中的表现。在我提供的例子中,有两个不同的网址(包含地址信息)。
一个是街道名为‘Byvej’,这个网址运行得很好,我在IDLE中得到了预期的结果。(我也可以获取到经纬度)。
另一个是街道名为‘Bispegårdsvej’,在IDLE中什么都没有返回。返回的列表是空的。这个网址在浏览器中可以正常工作,我知道我需要在脚本中添加一些东西,但我就是找不到有效的方法。
我使用的是ActivePython 2.7.2.5。谢谢,
Tommy
# -*- coding: cp1252 -*-
import urllib2
import json
#url='http://geo.oiorest.dk/adresser.json?postnr=4682&vejnavn=Byvej&husnr=31'
url='http://geo.oiorest.dk/adresser.json?postnr=4320&vejnavn=Bispegårdsvej&husnr=2'
try:
data = urllib2.urlopen(url).read()
adresser = json.loads(data)
for adresse in adresser:
print "%s %s, %s %s" % \
(adresse['vejnavn']['navn'],
adresse['husnr'],
adresse['postnummer']['nr'],
adresse['postnummer']['navn'])
except urllib2.HTTPError, e:
print "HTTP error: %d" % e.code
except urllib2.URLError, e:
print "Network error: %s" % e.reason.args[1]
2 个回答
0
你需要把一些特殊字符进行百分号编码,这个也叫做URL编码。经过百分号编码后,网址应该像这样:
http://geo.oiorest.dk/adresser.json?postnr=4320&vejnavn=Bispeg%C3%A5rdsvej&husnr=2
遵循RFC 3987中定义的IRI到URI映射的网络服务,会在字符标准化后使用utf-8进行编码。不过,你最好查看一下这个服务的文档,以确认应该使用什么编码。
在Python中,标准库里有一个叫做urllib.quote()的函数,可以用来对字符串进行百分号编码;还有一个叫做urllib.urlencode()的函数,可以用来对字典或者包含两个元素元组的可迭代对象进行百分号编码,从而生成查询参数用的字符串。
0
你需要正确地编码特殊字符,就像urlencode那样做的。
In[16]: urllib.urlencode([('postnr',4320),('vejnavn', 'Bispegårdsvej'), ('husnr',2)])
Out[16]: 'postnr=4320&vejnavn=Bispeg%C3%A5rdsvej&husnr=2'
如果你把这个字符串加上基础网址,应该就能正常工作(我至少在浏览器里试过)。
如果你愿意使用第三方库,requests是一个很受欢迎的选择。这样可以让事情变得简单:
import requests
response = requests.get('http://geo.oiorest.dk/adresser.json',
params = dict(postnr=4320,
vejnavn='Bispegårdsvej',
husnr=2))