我正在使用这个名为requests的很棒的库来维护Python2&3.兼容性和简化我的应用程序请求管理.

我需要解析一个url并替换其中一个参数.例如:

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

我想得到这个:

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

用这个方法我可以达到urllib:

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来做这个;库builds为这些参数传递了Python struct ,但没有提供任何工具来解析它们.这不是该项目的目标.

坚持使用urllib.parse方法解析参数.一旦有了字典或键值元组列表,只需将其传递给requests即可再次构建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)

在Python2和Python3中都可以获得urlparseparse_qs函数,如果出现异常,只需调整导入位置即可.

在Python 3上进行演示(没有导入异常保护),以演示已构建的URL:

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

Python-3.x相关问答推荐

根据其他数据框架的列顺序从数据框架中进行 Select

Pandas 数据帧断言等同于NaN

将strid()映射到Pandas DataFrame中的字符串不会更改NaN条目,但仍然声称它们不同?

在循环中使用Print&S结束参数时出现奇怪的问题

在不改变 python 中原始数组顺序的情况下,对多维字符串数组进行降序排序?

获取字符串中的两个工作日之间的差异

使用条件参数为 super() 调用 __init__

使用 from re findall 组合连续匹配并分离非连续匹配

如何融化具有自定义名称的Pandas

从 Python2 到 Python3 的这种解包行为的变化是什么?

PySpark python 问题:Py4JJavaError: An error occurred while calling o48.showString

使用 Sympy 方程进行绘图

为什么等效的 Python 代码要慢得多

在 ubuntu 20.04 中安装 libpq-dev 时出现问题

如何使用 Python 订阅 Websocket API 通道?

每次启动 Google Colab 时都必须安装所需的软件包吗?

在 Alembic 迁移期间更新列内容

从 csv 中删除单行而不复制文件

清除 PyCharm 运行窗口

print(... sep='', '\t' ) 是什么意思?