2015-02-04 14 views
8

Używam tej niesamowitej biblioteki o nazwie requests, aby zachować zgodność z python 2 & i uprościć zarządzanie żądaniami aplikacji.Python-Requests, parametry adresu wyodrębniania ze stringa

Mam przypadek, w którym muszę przeanalizować adres URL i zastąpić jeden z jego parametrów. Np:

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

I chcę uzyskać to:

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

Z urllib mogę osiągnąć to w następujący sposób:

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 

Jak można osiągnąć taki sam przy użyciu biblioteki requests ?

Odpowiedz

26

Do tego nie można użyć requests; biblioteki te budują takie adresy URL, jeśli przekazują strukturę Pythona dla parametrów, ale nie oferują narzędzi do ich analizowania. To nie jest cel tego projektu.

Trzymaj się metody urllib.parse, aby zanalizować parametry. Gdy masz słownika lub listę krotek klucz-wartość, po prostu przekazać, że do requests ponownie zbudować 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) 

można uzyskać zarówno funkcje urlparse i parse_qs zarówno w Pythonie 2 i 3, wszystko czego potrzebujesz zrobić, to dostosować lokalizację importu, jeśli otrzymasz wyjątek.

Demo na Python 3 (bez osłony wyjątków import) w celu wykazania URL został zbudowany:

>>> 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

chcę użyć Wnioski o ułatwienia zgodności między python 2 & 3 – Gab

+0

@Gab lecz 'requests' nie oferuje tej funkcji. –

+0

@Gab: Zaktualizowałem post, aby wyjaśnić, w jaki sposób można zachować zgodność między Python 2 i 3; ta sama funkcjonalność istnieje w obu wersjach, tylko w różnych lokalizacjach. "żądania" nie mogą tam pomóc. –