2014-02-24 41 views
4

我想寫一個腳本,可以解析一個url並從中獲取查詢參數。到目前爲止,我主要得到它,但urllib.urlencode添加方括號和單引號給我的價值,當我認爲它不應該。這很可能是我的誤解,所以如果有人能解釋爲什麼會發生這種情況以及如何避免它,我會非常感激。這裏是我的腳本:爲什麼urllib.urlencode將方括號和單引號添加到我的字典值中?

#/usr/bin/python 
import urlparse 
import urllib 

url = 'https://mysite.com?Action=ParseUrl' 
parsed_url = urlparse.urlparse(url) 
query_params = urlparse.parse_qs(parsed_url.query) 

query_string = urllib.urlencode(query_params) 
print query_string 

輸出的結果是:

Action=%5B%27ParseUrl%27%5D 

所以,你可以看到「操作」的價值得到了urlencoded的[」「]字符包圍。我想我的query_string變量的值爲:

Action=ParseUrl 

我可以對腳本做些什麼來實現此目的。我意識到我可以破解某些reg exp來刪除角色,但我寧願理解爲什麼這種方式不能按照我希望的方式工作的根本原因,所以我可以在將來避免這個問題。

謝謝!

+1

我有點困惑,爲什麼你一直通過'urlparse'運行它後,解析您的查詢字符串。 'parsed_url.query'已經是你需要的格式了 - 一個扁平的字符串。 – roippi

+0

如果你正在編寫新的代碼,你應該考慮使用'urllib.parse'等 – filmor

+0

「我有點困惑,爲什麼你一直通過運行裏urlparse之後解析您的查詢字符串parsed_url.query已經在你需要的格式。 - 一個扁平的字符串「。 –

回答

2

參見documentation notes about parse_qs(強調):

解析給定爲字符串參數的查詢字符串(類型的應用/數據的X WWW窗體-urlencoded)。數據作爲字典返回。字典鍵是唯一的查詢變量名稱,值爲列表的每個名稱的值。

可以證實這一點你自己:

>>> print query_params 
{'Action': ['ParseUrl']} 

考慮使用parse_qsl代替。隨着這一變化,腳本的其餘部分將按照您的預期運行。

+0

爲了更清楚地說明,有一個URL''https://mysite.com?Action = ParseUrl&action = ParseSecondUrl''是完全有效的,所以具有單個值的字典不會這樣做。 'parse_qsl'通過返回urlencode可以處理的列表[[('Action','ParseURL'),('Action','ParseSecondUrl')]'來修復這個問題。 – filmor

+0

謝謝!這很好。 –

0

你有選項,以使您的代碼工作

第一種是通過doseq=True到urllib.urlencode

import urlparse 
import urllib 

url = 'https://mysite.com?Action=ParseUrl' 
parsed_url = urlparse.urlparse(url) 
query_params = urlparse.parse_qs(parsed_url.query) 

query_string = urllib.urlencode(query_params,doseq=True) 
print (query_string) 

輸出

Action=ParseUrl 

被提到的第二個羅布肯尼迪將取代parse_qsparseql

import urlparse 
import urllib 

url = 'https://mysite.com?Action=ParseUrl' 
parsed_url = urlparse.urlparse(url) 
query_params = urlparse.parse_qsl(parsed_url.query) 

query_string = urllib.urlencode(query_params) 
print (query_string) 

輸出

Action=ParseUrl 
相關問題