Słownik Pythona do parametrów adresu URL

124

Próbuję przekonwertować słownik języka Python na ciąg znaków do użycia jako parametry adresu URL. Jestem pewien, że istnieje lepszy, bardziej Pythonowy sposób na zrobienie tego. Co to jest?

x = ""
for key, val in {'a':'A', 'b':'B'}.items():
    x += "%s=%s&" %(key,val)
x = x[:-1]
kzh
źródło

Odpowiedzi:

252

Użyj urllib.urlencode(). Pobiera słownik par klucz-wartość i konwertuje go na postać odpowiednią dla adresu URL (np key1=val1&key2=val2.).

Jeśli używasz Python3, użyj urllib.parse.urlencode()

Jeśli chcesz utworzyć adres URL z powtarzającymi się parametrami, takimi jak: p=1&p=2&p=3masz dwie opcje:

>>> import urllib
>>> a = (('p',1),('p',2), ('p', 3))
>>> urllib.urlencode(a)
'p=1&p=2&p=3'

lub jeśli chcesz utworzyć adres URL z powtarzającymi się parametrami:

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'
mipadi
źródło
4
jeśli chcesz utworzyć adres URL z powtarzającymi się parametrami, na przykład:? p = 1 & p = 2 & p = 3 then a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) wynik to 'p = 1 & p = 2 & p = 3'
panchicore
6
Inny sposób na uzyskanie powtarzalnych parametrów: urllib.urlencode ({'p': [1, 2, 3]}, dawkaq = True), co daje w wyniku 'p = 1 & p = 2 & p = 3'.
mbaechtold
Jeśli zastanawiasz się, o co doeseqchodzi: „Jeśli jakiekolwiek wartości w zapytaniu arg są sekwencjami, a dawkaq ma wartość true, każdy element sekwencji jest konwertowany na oddzielny parametr”.
Martin Thoma,
2

Użyj biblioteki do manipulacji adresami URL w języku Python innej firmy :

f = furl.furl('')
f.args = {'a':'A', 'b':'B'}
print(f.url) # prints ... '?a=A&b=B'

Jeśli potrzebujesz powtarzalnych parametrów, możesz wykonać następujące czynności:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'
Mayank Jaiswal
źródło
Gdzie dostanę furl? Wydaje się, że nie jest to standardowa biblioteka
AMADANON Inc.
1
pip install furlTo nie jest część standardowej biblioteki
Mayank Jaiswal
-7

Wydaje mi się to trochę bardziej Pythonic i nie używa żadnych innych modułów:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])
Tao Starbow
źródło
8
To nie będzie procent poprawnie zakodować parametrów. Spowoduje to nieoczekiwane rezultaty, jeśli Twoje dane zawierają znaki handlowe, znaki równości, krzyżyki itp.
Jamie Cockburn