我正在尝试使用URLLIB2打开URL并将内容读回到数组中。问题似乎是您不能在具有格式字符的URL中使用字符串插值,例如%20表示空格,%3C表示'<'。有问题的URL中有空格和一些xml。
我的代码很简单,看起来像这样:
#Python script to fetch NS Client Policies using GUID
import sys
import urllib2
def GetPolicies(ns, guid):
ns = sys.argv[1]
guid = sys.argv[2]
fetch = urllib2.urlopen('http://%s/Altiris/NS/Agent/GetClientPolicies.aspx?xml=%3Crequest%20configVersion=%222%22%20guid=%22{%s}%22') % (ns, guid)
我为了简洁起见缩短了网址,但是你得到了一般的想法,你得到一个'格式字符串的参数不够'错误,因为它假设你想要使用%3,%20和其他东西字符串插值。你怎么解决这个问题?
答案 0 :(得分:5)
您可以将%
标志加倍
url = 'http://%s/Altiris/NS/Agent/GetClientPolicies.aspx?xml=%%3Crequest%%20configVersion=%%222%%22%%20guid=%%22{%s}%%22' % (ns, guid)
或者您可以使用.format()
方法
url = 'http://{hostname}/Altiris/NS/Agent/GetClientPolicies.aspx?xml=%3Crequest%20configVersion=%222%22%20guid=%22{id}%%2''.format(hostname=ns, id=guid)
答案 1 :(得分:1)
在字符串上使用.format
方法。从其文档:
str.format(*args, **kwargs)
Perform a string formatting operation. The string on which this method is called can contain literal text or replacement fields delimited by braces {}. Each replacement field contains either the numeric index of a positional argument, or the name of a keyword argument. Returns a copy of the string where each replacement field is replaced with the string value of the corresponding argument.
>>> "The sum of 1 + 2 is {0}".format(1+2)
'The sum of 1 + 2 is 3'
虽然我们都习惯于坚持使用%
,但format
方法实际上是一种将值插入字符串的更强大的方法。
答案 2 :(得分:0)
逐步构建字符串,分别执行每个编码层。比试图一次性应对多级逃逸更容易管理。
xml= '<request configVersion="2" guid="{%s}"/>' % cgi.escape(guid, True)
query= 'xml=%s' % urllib2.quote(xml)
url= 'http://%s/Altiris/NS/Agent/GetClientPolicies.aspx?%s' % (ns, query)
fetch= urllib2.urlopen(url)
答案 3 :(得分:0)
如果您尝试自己构建网址,请使用urllib.urlencode。它将为您处理很多引用问题。只需传递一份你想要的信息:
from urllib import urlencode
args = urlencode({'xml': '<',
'request configVersion': 'bar',
'guid': 'zomg'})
至于替换url字符串基础中的hostname,只需执行其他人所说的内容并使用%s格式。最后的字符串可能是:
print 'http://%s/Altiris/NS/Agent/GetClientPolicies.aspx?%s' % ('foobar.com', args)