Substitua caracteres especiais na string usando o escape% xx. Letras, dígitos e os caracteres '_.-' nunca são citados. Por padrão, essa função se destina a citar a seção de caminho da URL. O parâmetro opcional safe especifica caracteres adicionais que não devem ser citados - seu valor padrão é '/'
Isso significa que passar '' para o cofre resolverá seu primeiro problema:
Sobre a segunda edição, há um relatório de bug sobre isso aqui . Aparentemente, ele foi corrigido no python 3. Você pode contornar isso codificando como utf8 assim:
Obrigado, ambos funcionaram muito bem. O urlencode chama apenas quoteplus muitas vezes em um loop, o que não é a normalização correta para minha tarefa (oauth).
Paul Tarjan
6
a especificação: rfc 2396 define-os como reservados. reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","É com isso que o urllib.quote está lidando.
22815 Jeffreyffffffff
63
urllib.quotemudou-se para urlib.parse.quote, desde Python3.
Além disso, no caso de codificar uma consulta de pesquisa, talvez seja melhor usar quote_plus: docs.python.org/3/library/… 1. Ele codifica barras por padrão 2. Ele também codifica espaços
O nome quoteé bastante vago como um global. Pode ser mais agradável de usar algo como urlencode: from urllib.parse import quote as urlencode.
Luc
Note-se que há uma função chamada urlencodeem urllib.parsejá que faz algo completamente diferente, então você seria melhor fora de escolher outro nome ou o risco de confundir seriamente futuros leitores do seu código.
jaymmer - Restabelece Monica
48
Minha resposta é semelhante à resposta de Paolo.
Eu acho que o módulo requestsé muito melhor. É baseado em urllib3. Você pode tentar isso:
Observe que as alterações no Python desde que esta resposta foi publicada significam que agora é um wrapper herdado. No código-fonte do Django 2.1 para django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
É melhor usar urlencodeaqui. Não há muita diferença para um único parâmetro, mas o IMHO torna o código mais claro. (Parece confuso ver uma função quote_plus! Especialmente as que vêm de outros idiomas)
Respostas:
Python 2
Dos documentos :
Isso significa que passar '' para o cofre resolverá seu primeiro problema:
Sobre a segunda edição, há um relatório de bug sobre isso aqui . Aparentemente, ele foi corrigido no python 3. Você pode contornar isso codificando como utf8 assim:
A propósito, dê uma olhada no urlencode
Python 3
O mesmo, exceto substituir
urllib.quote
porurllib.parse.quote
.fonte
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
É com isso que o urllib.quote está lidando.urllib.quote
mudou-se paraurlib.parse.quote
, desde Python3.urllib.parse.quote
docsNo Python 3,
urllib.quote
foi movido paraurllib.parse.quote
e lida com unicode por padrão.fonte
quote
é bastante vago como um global. Pode ser mais agradável de usar algo como urlencode:from urllib.parse import quote as urlencode
.urlencode
emurllib.parse
já que faz algo completamente diferente, então você seria melhor fora de escolher outro nome ou o risco de confundir seriamente futuros leitores do seu código.Minha resposta é semelhante à resposta de Paolo.
Eu acho que o módulo
requests
é muito melhor. É baseado emurllib3
. Você pode tentar isso:fonte
requests.utils.quote
é um link para pythonquote
. Veja fontes de solicitação .requests.utils.quote
é um invólucro compatibilidade fina paraurllib.quote
para python 2 eurllib.parse.quote
para python 3Se você estiver usando django, poderá usar urlquote:
Observe que as alterações no Python desde que esta resposta foi publicada significam que agora é um wrapper herdado. No código-fonte do Django 2.1 para django.utils.http:
fonte
É melhor usar
urlencode
aqui. Não há muita diferença para um único parâmetro, mas o IMHO torna o código mais claro. (Parece confuso ver uma funçãoquote_plus
! Especialmente as que vêm de outros idiomas)Documentos
urlencode: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
quote_plus: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus
fonte