Предположим, мне дали URL.
Возможно, он уже имеет параметры GET (например http://example.com/search?q=question
), а может и нет (например http://example.com/
).
А теперь мне нужно добавить к нему некоторые параметры вроде {'lang':'en','tag':'python'}
. В первом случае буду иметь, http://example.com/search?q=question&lang=en&tag=python
а во втором - http://example.com/search?lang=en&tag=python
.
Есть какой-нибудь стандартный способ сделать это?
urlparse.parse_qs
вместоparse_qsl
. Последний возвращает список, а вам нужен dict. См. Docs.python.org/library/urlparse.html#urlparse.parse_qs .urlencode
какurllib.urlencode(query, doseq=True)
. В противном случае параметры, которые существовали в исходном URL-адресе, не сохраняются правильно (потому что они возвращаются в виде кортежей из @ parse_qs @urlparse()
иurlsplit()
на самом деле являютсяnamedtuple
экземплярами. Таким образом, вы можете назначить их напрямую переменной и использоватьurl_parts = url_parts._replace(query = …)
для ее обновления.Зачем
Меня не удовлетворили все решения на этой странице ( давай, а где наша любимая вещь для копирования и вставки? ), Поэтому я написал свои собственные, основанные на ответах здесь. Он пытается быть полным и более питоническим. Я добавил обработчик для значений dict и bool в аргументы, чтобы они были более удобными для потребителя ( JS ), но они все же необязательны, вы можете отказаться от них.
Как это устроено
Тест 1: добавление новых аргументов, обработка массивов и значений типа Bool:
Тест 2: перезапись существующих аргументов, обработка значений DICT:
Обсуждение дешево. Покажи мне код.
Сам код. Я постарался описать это подробнее:
Имейте в виду, что могут быть некоторые проблемы, если вы их обнаружите, сообщите мне, и мы сделаем это лучше
источник
http://stackoverflow.com/with%2Fencoded?data=some&data=values&answe%2rs=false
. Кроме того, используйте три шеврона,>>>
чтобы помочь доктестам собрать ваши документыparsed_get_args = dict(parse_qsl(get_args))
наparsed_get_args = parse_qs(get_args)
Вы хотите использовать кодировку URL-адреса, если строки могут содержать произвольные данные (например, необходимо будет кодировать такие символы, как амперсанды, косые черты и т. Д.).
Посмотрите urllib.urlencode:
В python3:
источник
Вы также можете использовать модуль Furl https://github.com/gruns/furl
источник
Передайте его в библиотеку протестированных запросов .
Вот как я это сделаю:
источник
Если вы используете запросы lib :
источник
Да: используйте urllib .
Из примеров в документации:
источник
Основываясь на этом ответе, однострочный вариант для простых случаев (код Python 3):
или:
источник
?
в anchor (#?stuff
) есть символ .Я считаю это более элегантным, чем два основных ответа:
Самые важные вещи, которые мне не нравятся в верхних ответах (тем не менее, они хорошие):
query
находится в компонентах URLParseResult
Что плохо в моем ответе, так это волшебно выглядящее
dict
слияние с использованием распаковки, но я предпочитаю это обновлению уже существующего словаря из-за моего предубеждения против изменчивости.источник
Мне понравилась версия Лукаша, но поскольку функции urllib и urllparse несколько неудобны в использовании в этом случае, я думаю, что проще сделать что-то вроде этого:
источник
Используйте различные
urlparse
функции, чтобы разделить существующий URL-адресurllib.urlencode()
в объединенном словаре, а затемurlparse.urlunparse()
снова собрать все вместе.Или просто возьмите результат
urllib.urlencode()
и соответствующим образом присоедините его к URL-адресу.источник
Еще один ответ:
источник
Вот как я это реализовал.
Работал как шарм. Однако мне хотелось бы более чистый способ реализовать это.
Другой способ реализовать вышеизложенное - поместить это в метод.
источник
В Python 2.5
источник