如何使用包含格式字符的URL进行字符串插值?

时间:2010-10-28 16:02:28

标签: python

我正在尝试使用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和其他东西字符串插值。你怎么解决这个问题?

编辑:解决方案需要Python 2.6 +,2.5或者先前不支持string.format()方法

4 个答案:

答案 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)