Suponha que recebi um URL.
Ele já pode ter parâmetros GET (por exemplo http://example.com/search?q=question
) ou pode não ter (por exemplo http://example.com/
).
E agora eu preciso adicionar alguns parâmetros a ele, como {'lang':'en','tag':'python'}
. No primeiro caso eu vou ter http://example.com/search?q=question&lang=en&tag=python
e no segundo - http://example.com/search?lang=en&tag=python
.
Existe alguma maneira padrão de fazer isso?
urlparse.parse_qs
vez deparse_qsl
. O último retorna uma lista enquanto você deseja um ditado. Consulte docs.python.org/library/urlparse.html#urlparse.parse_qs .urlencode
comourllib.urlencode(query, doseq=True)
. Caso contrário, os parâmetros que existiam na URL original não são preservadas corretamente (porque eles são retornados como tuplas de @ parse_qs @urlparse()
eurlsplit()
são realmentenamedtuple
instâncias. Assim, você pode atribuí-los diretamente a uma variável e usarurl_parts = url_parts._replace(query = …)
para atualizá-la.Por quê
Não fiquei satisfeito com todas as soluções desta página ( vamos lá, onde está a nossa coisa favorita de copiar e colar? ), Então escrevi as minhas com base nas respostas aqui. Ele tenta ser completo e mais pitônico. Eu adicionei um manipulador para valores dict e bool nos argumentos para ser mais amigável ao consumidor ( JS ), mas eles ainda são opcionais, você pode descartá-los.
Como funciona
Teste 1: Adicionando novos argumentos, manipulando matrizes e valores Bool:
Teste 2: Reescrevendo argumentos existentes, manipulando valores DICT:
Falar é fácil. Mostre-me o código.
Código em si. Eu tentei descrevê-lo em detalhes:
Esteja ciente de que pode haver alguns problemas. Se você encontrar um, entre em contato e faremos com que isso melhore.
fonte
http://stackoverflow.com/with%2Fencoded?data=some&data=values&answe%2rs=false
. Além disso, use três divisas>>>
para ajudar os doctests a pegá-losparsed_get_args = dict(parse_qsl(get_args))
paraparsed_get_args = parse_qs(get_args)
Você deseja usar a codificação de URL se as seqüências de caracteres puderem ter dados arbitrários (por exemplo, caracteres como e comercial, barras, etc. precisarão ser codificados).
Confira urllib.urlencode:
Em python3:
fonte
Você também pode usar o módulo furl https://github.com/gruns/furl
fonte
Terceirize-o para a biblioteca de solicitações testadas em batalha .
É assim que eu vou fazer:
fonte
Se você estiver usando os pedidos lib :
fonte
Sim: use urllib .
Dos exemplos na documentação:
fonte
Com base nesta resposta, uma linha para casos simples (código Python 3):
ou:
fonte
?
na âncora (#?stuff
).Acho isso mais elegante do que as duas principais respostas:
As coisas mais importantes que não gosto nas respostas principais (elas são boas):
query
está o componente da URLParseResult
O que é ruim na minha resposta é a
dict
mesclagem de aparência mágica usando a descompactação, mas eu prefiro isso a atualizar um dicionário já existente por causa do meu preconceito contra a mutabilidade.fonte
Eu gostei da versão Łukasz, mas como as funções urllib e urllparse são um pouco difíceis de usar nesse caso, acho mais simples fazer algo assim:
fonte
Use as várias
urlparse
funções para separar o URL existente,urllib.urlencode()
no dicionário combinado, eurlparse.urlunparse()
reuni-lo novamente.Ou apenas pegue o resultado
urllib.urlencode()
e concatene-o no URL de forma apropriada.fonte
Ainda outra resposta:
fonte
Aqui está como eu o implementei.
Funcionou como um encanto. No entanto, eu gostaria de ter uma maneira mais limpa de implementar isso.
Outra maneira de implementar o acima é colocá-lo em um método.
fonte
No python 2.5
fonte