[英]Encoding in Python - non-English characters into a URL
我正在一点一点地尝试编写地理编码脚本。 有一个丹麦的(官方和免费的)Web服务,在这里我在URL中输入一个地址,并获得包含所有所需信息的json文件。
当丹麦语字符(æ,ø,å)进入URL时,我找不到正确的翻译方法。 在示例中,我包含了两个不同的URL(包含地址信息)。 一个-街道在'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]
您需要使用百分比编码(也称为URL编码)对社交字符进行编码。 经过百分比编码后,URL应如下所示:
http://geo.oiorest.dk/adresser.json?postnr=4320&vejnavn=Bispeg%C3%A5rdsvej&husnr=2
符合RFC 3987中定义的IRI到URI映射的Web服务将在字符归一化后使用utf-8进行编码,但是您需要检查该服务的文档以确保使用哪种编码。
Python在标准库中具有urllib.quote()来对字符串进行百分比编码,在标准库中具有urllib.urlencode()来对字典或两个元素元组的可迭代项进行百分比编码,以生成用于查询参数的字符串。
您必须正确编码特殊字符,例如urlencode可以:
In[16]: urllib.urlencode([('postnr',4320),('vejnavn', 'Bispegårdsvej'), ('husnr',2)])
Out[16]: 'postnr=4320&vejnavn=Bispeg%C3%A5rdsvej&husnr=2'
如果您随后将基本url放在此字符串之前,这应该可以工作(我至少在浏览器中尝试过)。
如果您愿意获得第三方软件包,则请求将是一个不错的选择。 它将简化为:
import requests
response = requests.get('http://geo.oiorest.dk/adresser.json',
params = dict(postnr=4320,
vejnavn='Bispegårdsvej',
husnr=2))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.