【发布时间】:2018-10-24 12:44:47
【问题描述】:
我正在使用 python 3.5.2,我正在尝试自动打开一个带有参数的 url(其中许多参数是从 csv 文件中读取的)。我的问题是其中一个参数在“Møre 2013”中包含挪威字母“ø”(参见 ...projects:“Møre%202013”,其中 %20 用于包含 Møre 和 2013 之间的空格),这会导致错误信息。
bat 文件使用来自 csv 文件的输入参数运行 lesurl.py。 我在 lesurl.py 中的代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys # for å kunne lese variable
import urllib.request # for å lese url
fn=sys.argv[1]
minx = sys.argv[2]
miny = sys.argv[3]
maxx = sys.argv[4]
maxy = sys.argv[5]
pnavn = sys.argv[6]
c = sys.argv[7]
u = sys.argv[8]
pwd = sys.argv[9]
f = sys.argv[10]
bestilling = urllib.request.urlopen('https://tjenester.norgeibilder.no/REST/StartExport.ashx?request={username:"'+u+'",password:"'+pwd+'",copyEmail:"",comment:"'+fn+'",coordInput:{type:"Polygon",coordinates:[[['+minx+','+maxy+'],['+maxx+','+maxy+'],['+maxx+','+miny+'],['+minx+','+miny+'],['+minx+','+maxy+']]},inputWkid:'+c+',cutNationalBorder:0,format:'+f+',resolution:'+r+',outputWkid:'+c+',fillColor:255,projects:"Møre%202013",imagemosaic:2}').read()
print(bestilling)
“Møre%202013”似乎会导致错误:
Traceback (most recent call last):
File "b_of_lesurl.py", line 28, in <module>
bestilling = urllib.request.urlopen('https://tjenester.norgeibilder.no/REST/StartExport.ashx?request={username:"'+u+'",password:"'+pwd+'
",copyEmail:"",comment:"'+fn+'",coordInput:{type:"Polygon",coordinates:[[['+minx+','+maxy+'],['+maxx+','+maxy+'],['+maxx+','+miny+'],['+minx
+','+miny+'],['+minx+','+maxy+']]},inputWkid:'+c+',cutNationalBorder:0,format:'+f+',resolution:'+r+',outputWkid:'+c+',fillColor:255,projects
:"Møre%202013",imagemosaic:2}').read()
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 163, in urlopen
return opener.open(url, data, timeout)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 466, in open
response = self._open(req, data)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 484, in _open
'_open', req)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 444, in _call_chain
result = func(*args)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 1297, in https_open
context=self._context, check_hostname=self._check_hostname)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 1254, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 1106, in request
self._send_request(method, url, body, headers)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 1141, in _send_request
self.putrequest(method, url, **skips)
File "C:\Users\ban\AppData\Local\Programs\Python\Python35-32\lib\http\client.py", line 983, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode character '\xf8' in position 344: ordinal not in range(128)
我尝试过不同的 encode('utf-8') 变体,例如(并在 urlopen 中使用 ...projects:"'+s+'",...。
s="Møre%202013"
print(s)
s=s.encode('utf-8')
print(s)
给予
Møre%202013
b'M\xc3\xb8re%202013'
b'M\xc3\xb8re%202013'
并且仍然给出编码错误。 如何正确包含“ø”? (顺便说一句,例如“Oslo 2015”工作正常。)
【问题讨论】:
-
您正在通过字符串连接构建 URL。不要那样做,与不应该使用字符串连接构建 SQL 或 HTML 的原因完全相同:缺少字符转义。此外,使用比
urllib更高的抽象。有requests模块,使用它。它为您完成所有转义,并且比低级模块更容易使用。 -
所以一些事情......我认为你需要对字符串进行 URL 百分比编码,因为有效的 URL 字符非常有限。这是一个示例:看起来您的测试已经有一个 %20,这将是一个空格,所以我猜测的 reas 字符串是:s='Møre 2013' 然后百分比编码:urllib.parse.quote(s) > >> 'M%C3%B8re%202013' : 解码它: urllib.parse.unquote('M%C3%B8re%202013') >>> 'Møre 2013'
-
@sehafoc:谢谢,这暂时可以解决问题(也会查看 @Tomalak 提到的 \ requests )。我在我的 csv 文件中包含了有效的 URL 字符:
flatenr,llx,lly,urx,ury,prosjektnavn 04280594,647530,6783954,663618,6800042,"%C3%98stlandet%202013" 04320589,606175,6840380,622263,6856468,"Hedmark%20NORD%202015" 15340577,350730,6933982,366818,6950070,"M%C3%B8re%202013"并在 urlopen-call 中使用了...projects:"'+s+'",...。 -
我正在寻找一种方法来从文件的 urlopen 调用中添加“项目”名称,因为我从网站上请求了 20 张图像。项目名称包括 æ、ø 和 å 以及空格,例如“Østlandet 2013”、“Hedmark NORD 2015”和“Møre 2013”。
-
请求可能会容易得多...您通常会将其用于更友好的界面。 urllib 中也有 URL 构建器函数。在这里查看stackoverflow.com/questions/15799696/…。您可以将 URL 引用行添加到构建器示例之一。
标签: python-3.x utf-8