2015-02-04 14 views
8

Sto usando questa fantastica libreria denominata requests per mantenere la compatibilità con Python 2 & 3 e semplificare la gestione delle richieste dell'applicazione.Python-Requests, estrae i parametri url da una stringa

Ho un caso in cui ho bisogno di analizzare un url e sostituire uno dei suoi parametri. Ad esempio:

http://example.com?param1=a&token=TOKEN_TO_REPLACE&param2=c 

e voglio ottenere questo:

http://example.com?param1=a&token=NEW_TOKEN&param2=c 

Con la urllib posso realizzare in questo modo:

from urllib.parse import urlparse 
from urllib.parse import parse_qs 
from urllib.parse import urlencode 

url = 'http://example.com?param1=a&token=TOKEN_TO_REPLACE&param2=c' 

o = urlparse(url) 
query = parse_qs(o.query) 
if query.get('token'): 
    query['token'] = ['NEW_TOKEN', ] 
    new_query = urlencode(query, doseq=True) 
    url.split('?')[0] + '?' + new_query 

>>> http://example.com?param2=c&param1=a&token=NEW_TOKEN 

Come si può ottenere lo stesso utilizzando la libreria requests ?

risposta

26

Per questo non è possibile utilizzare requests; la libreria crea tali URL se ha passato una struttura Python per i parametri, ma non offre alcuno strumento per analizzarli. Questo non è un obiettivo del progetto.

Attenersi al metodo urllib.parse per analizzare i parametri. Una volta che avete un dizionario o lista di tuple chiave-valore, basta passare che per requests per costruire di nuovo l'URL:

try: 
    # Python 3 
    from urllib.parse import urlparse, parse_qs 
except ImportError: 
    # Python 2 
    from urlparse import urlparse, parse_qs 

o = urlparse(url) 
query = parse_qs(o.query) 
# extract the URL without query parameters 
url = o._replace(query=None).geturl() 

if 'token' in query: 
    query['token'] = 'NEW_TOKEN' 

requests.get(url, params=query) 

è possibile ottenere sia le urlparse e parse_qs funzioni sia in Python 2 e 3, tutto ciò che serve fare è regolare la posizione di importazione se si ottiene un'eccezione.

Demo su Python 3 (senza la protezione eccezioni importazione) per dimostrare l'URL essendo stata costruita:

>>> from urllib.parse import urlparse, parse_qs 
>>> url = "http://httpbin.org/get?token=TOKEN_TO_REPLACE&param2=c" 
>>> o = urlparse(url) 
>>> query = parse_qs(o.query) 
>>> url = o._replace(query=None).geturl() 
>>> if 'token' in query: 
...  query['token'] = 'NEW_TOKEN' 
... 
>>> response = requests.get(url, params=query) 
>>> print(response.text) 
{ 
    "args": { 
    "param2": "c", 
    "token": "NEW_TOKEN" 
    }, 
    "headers": { 
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.5.1 CPython/3.4.2 Darwin/14.1.0" 
    }, 
    "origin": "188.29.165.245", 
    "url": "http://httpbin.org/get?token=NEW_TOKEN&param2=c" 
} 
+0

voglio usare Le richieste di compatibilità più facile tra Python 2 e 3 – Gab

+0

@Gab: ma 'requests' non offre quella funzionalità. –

+0

@Gab: ho aggiornato il post per chiarire come è possibile mantenere la compatibilità tra Python 2 e 3; la stessa funzionalità esiste in entrambe le versioni, solo in posizioni diverse. 'richieste' non possono aiutare lì. –

Problemi correlati