Python-Requests,从字符串中提取url参数

Python-Requests, extract url parameters from a string

我使用这个名为requests的很棒的库来维护python 2&3的兼容性,并简化我的应用程序请求管理。

我有一个案例需要解析一个URL并替换它的一个参数。例如:

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

我想知道:

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

urllib我可以这样实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

如何使用requests库实现相同的功能?


您不能为此使用requests;如果为参数传递了一个python结构,库就会构建这样的URL,但不提供任何工具来解析这些URL。这不是项目的目标。

坚持使用urllib.parse方法解析参数。一旦您有了一个字典或键值元组列表,只需将其传递给requests即可再次构建URL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)

您可以在python 2和3中同时获得urlparseparse_qs函数,只要您遇到异常,就需要调整导入位置。

在python 3上演示(不带导入异常保护),以演示已构建的URL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> 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"
}


仅使用请求….

1
2
3
4
5
6
7
query = requests.utils.urlparse(url).query
params = dict(x.split('=') for x in query.split('&'))

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

requests.get(url, params=params)