Załóżmy, że otrzymałem adres URL.
Może już mieć parametry GET (np. http://example.com/search?q=question
) Lub może nie (np http://example.com/
.).
A teraz muszę dodać do tego kilka parametrów jak np {'lang':'en','tag':'python'}
. W pierwszym przypadku będę miał, http://example.com/search?q=question&lang=en&tag=python
aw drugim - http://example.com/search?lang=en&tag=python
.
Czy jest jakiś standardowy sposób, aby to zrobić?
urlparse.parse_qs
zamiastparse_qsl
. Ten ostatni zwraca listę, podczas gdy ty chcesz dyktować. Zobacz docs.python.org/library/urlparse.html#urlparse.parse_qs .urlencode
asurllib.urlencode(query, doseq=True)
. W przeciwnym razie parametry, które istniały w oryginalnym adresie URL, nie są zachowywane poprawnie (ponieważ są zwracane jako krotki z @ parse_qs @urlparse()
iurlsplit()
są w rzeczywistościnamedtuple
przykładami. W ten sposób możesz przypisać je bezpośrednio do zmiennej i użyćurl_parts = url_parts._replace(query = …)
do jej aktualizacji.Czemu
Nie byłem zadowolony ze wszystkich rozwiązań na tej stronie (no dalej, gdzie jest nasza ulubiona rzecz do kopiowania i wklejania? ), Więc napisałem własne na podstawie odpowiedzi tutaj. Stara się być kompletna i bardziej Pythonic. Dodałem procedurę obsługi dla wartości dict i bool w argumentach, aby były bardziej przyjazne dla konsumenta ( JS ), ale są one jeszcze opcjonalne, możesz je usunąć.
Jak to działa
Test 1: Dodawanie nowych argumentów, obsługa tablic i wartości logicznych:
Test 2: Przepisywanie istniejących argumentów, obsługa wartości DICT:
Rozmowa jest tania. Pokaż mi kod.
Sam kod. Starałem się to szczegółowo opisać:
Pamiętaj, że mogą wystąpić pewne problemy, jeśli znajdziesz taki, daj mi znać, a my poprawimy to
źródło
http://stackoverflow.com/with%2Fencoded?data=some&data=values&answe%2rs=false
. Ponadto użyj trzech szewronów,>>>
aby pomóc w testach doctestówparsed_get_args = dict(parse_qsl(get_args))
naparsed_get_args = parse_qs(get_args)
Chcesz użyć kodowania adresu URL, jeśli ciągi mogą zawierać dowolne dane (na przykład znaki takie jak ampersandy, ukośniki itp. Będą musiały zostać zakodowane).
Sprawdź urllib.urlencode:
W python3:
źródło
Możesz również skorzystać z modułu furl https://github.com/gruns/furl
źródło
Zleć go do biblioteki żądań przetestowanych w bitwie .
Oto jak to zrobię:
źródło
Jeśli używasz żądań lib :
źródło
Tak: użyj urllib .
Z przykładów w dokumentacji:
źródło
Opierając się na tej odpowiedzi, jednowierszowy dla prostych przypadków (kod Python 3):
lub:
źródło
?
w kotwicy (#?stuff
) znajduje się znak .Uważam to za bardziej eleganckie niż dwie najpopularniejsze odpowiedzi:
Najważniejsze rzeczy, których nie lubię w górnych odpowiedziach (są jednak dobre):
query
znajduje się element URLParseResult
Złe w mojej odpowiedzi jest magicznie wyglądające
dict
scalanie przy użyciu rozpakowywania, ale wolę to od aktualizowania już istniejącego słownika z powodu mojego uprzedzenia wobec zmienności.źródło
Podobała mi się wersja Łukasz, ale ponieważ funkcje urllib i urllparse są w tym przypadku nieco niewygodne, myślę, że łatwiej jest zrobić coś takiego:
źródło
Użyj różnych
urlparse
funkcji, aby rozdzielić istniejący adres URLurllib.urlencode()
w połączonym słowniku, a następnieurlparse.urlunparse()
złożyć go z powrotem.Lub po prostu weź wynik
urllib.urlencode()
i odpowiednio połącz go z adresem URL.źródło
Jeszcze inna odpowiedź:
źródło
Oto jak to wdrożyłem.
Działał jak urok. Wolałbym jednak bardziej przejrzysty sposób wdrożenia tego.
Innym sposobem implementacji powyższego jest umieszczenie go w metodzie.
źródło
W Pythonie 2.5
źródło