2010-10-28 86 views
2

我試圖使用URLLIB2來打開一個URL並將內容讀回到一個數組中。問題似乎是,您不能在具有格式化字符的網址中使用字符串插值,如%20爲空格,%3C爲'<'。有問題的網址中有空格和一點xml。如何使用包含格式化字符的URL進行字符串插值?

我的代碼是非常簡單的,看起來是這樣的:

#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) 

我已經縮短爲簡潔的URL,但你得到的總體思路,你因爲「沒有足夠的參數格式字符串」錯誤它假定你想要使用%3,%20和其他字符串插值。你如何解決這個問題?

編輯:溶液需要Python 2.6+,2.5或之前具有用於的String.Format()方法

回答

4

您可以雙擊該%跡象

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) 
+0

或者正好連接:'URL =的 'http://' + NS +「/Altiris/NS/Agent/GetClientPolicies.aspx?xml= %3Crequest%20configVersion =%222%22%20guid =%22 {'+ guid +'}%22''。 – adw 2010-10-28 16:19:57

+0

太棒了,謝謝! – 2010-10-28 16:26:09

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' 

雖然我們所有的罪由是我們已經習慣從C堅持%,該format方法真的是插值值轉換成字符串的一個更強大的方法。

+0

感謝您的快速反應 – 2010-10-28 16:23:01

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) 
0

如果您試圖自己構建網址urllib.urlencode。它會爲你處理很多報價問題。只是通過它您想要的信息的字典:

from urllib import urlencode 

args = urlencode({'xml': '<', 
      'request configVersion': 'bar', 
       'guid': 'zomg'}) 

至於你的URL字符串的底座更換主機,只是做其他人說,使用%S格式。最終的字符串可以爲財產以後這樣的:

print 'http://%s/Altiris/NS/Agent/GetClientPolicies.aspx?%s' % ('foobar.com', args) 
相關問題