![]() |
阳刚的饭盒 · Electron 对 SQLite ...· 2 月前 · |
![]() |
满身肌肉的八宝粥 · Learning Unity Day : 9 -· 3 月前 · |
![]() |
酷酷的便当 · app自动化(一)app自动化环境搭建 - ...· 11 月前 · |
![]() |
神勇威武的西瓜 · React-Native/Android ...· 11 月前 · |
![]() |
茫然的雪糕 · 超分之VESPCN-CSDN博客· 1 年前 · |
假设我得到了一个URL。
它可能已经有了GET参数(例如
http://example.com/search?q=question
),也可能没有(例如
http://example.com/
)。
现在我需要给它添加一些参数,比如
{'lang':'en','tag':'python'}
。在第一种情况下,我将使用
http://example.com/search?q=question&lang=en&tag=python
,在第二种情况下-
http://example.com/search?lang=en&tag=python
。
有什么标准的方法可以做到这一点吗?
使用各种
urlparse
函数拆分现有的URL,组合字典上的
urllib.urlencode()
,然后使用
urlparse.urlunparse()
将其重新组合在一起。
或者直接获取
urllib.urlencode()
的结果并将其适当地连接到URL。
urllib
和
urlparse
模块有一些奇怪的地方。下面是一个有效的示例:
try:
import urlparse
from urllib import urlencode
except: # For Python 3
import urllib.parse as urlparse
from urllib.parse import urlencode
url = "http://stackoverflow.com/search?q=question"
params = {'lang':'en','tag':'python'}
url_parts = list(urlparse.urlparse(url))
query = dict(urlparse.parse_qsl(url_parts[4]))
query.update(params)
url_parts[4] = urlencode(query)
print(urlparse.urlunparse(url_parts))
ParseResult
,
urlparse()
,
is read-only
的结果,我们需要将它转换成
list
,然后才能尝试修改它的数据。
在python 2.5中
import cgi
import urllib
import urlparse
def add_url_param(url, **params):
parts = list(urlparse.urlsplit(url))
d = dict(cgi.parse_qsl(parts[n])) # use cgi.parse_qs for list values
d.update(params)
parts[n]=urllib.urlencode(d)
return urlparse.urlunsplit(parts)
url = "http://stackoverflow.com/search?q=question"
add_url_param(url, lang='en') == "http://stackoverflow.com/search?q=question&lang=en"
下面是我如何实现它的。
import urllib
params = urllib.urlencode({'lang':'en','tag':'python'})
url = ''
if request.GET:
url = request.url + '&' + params
else:
url = request.url + '?' + params
就像一个护身符。然而,我希望有一种更简洁的方式来实现这一点。
实现上述功能的另一种方式是将其放入一个方法中。
import urllib
def add_url_param(request, **params):
new_url = ''
_params = dict(**params)
_params = urllib.urlencode(_params)
if _params:
if request.GET:
new_url = request.url + '&' + _params
else:
new_url = request.url + '?' + _params
else:
new_url = request.url
return new_ur
还有另一个答案:
def addGetParameters(url, newParams):
(scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url)
queryList = urlparse.parse_qsl(query, keep_blank_values=True)
for key in newParams:
queryList.append((key, newParams[key]))
return urlparse.urlunparse((scheme, netloc, path, params, urllib.urlencode(queryList), fragment))
您还可以使用furl模块 https://github.com/gruns/furl
>>> from furl import furl
>>> print furl('http://example.com/search?q=question').add({'lang':'en','tag':'python'}).url
http://example.com/search?q=question&lang=en&tag=python
基于 this answer,简单情况的一行代码(Python3代码):
from urllib.parse import urlparse, urlencode
url = "https://stackoverflow.com/search?q=question"
params = {'lang':'en','tag':'python'}
url += ('&' if urlparse(url).query else '?') + urlencode(params)
或者:
url += ('&', '?')[urlparse(url).query == ''] + urlencode(params)
如果您正在使用 requests lib
import requests
params = {'tag': 'python'}
requests.get(url, params=params)
外包给经过战斗考验的 requests library 。
这就是我要做的:
from requests.models import PreparedRequest
url = 'http://example.com/search?q=question'
params = {'lang':'en','tag':'python'}
req = PreparedRequest()
req.prepare_url(url, params)
print(req.url)
python3
,我想不言自明
from urllib.parse import urlparse, urlencode, parse_qsl
url = 'https://www.linkedin.com/jobs/search?keywords=engineer'
parsed = urlparse(url)
current_params = dict(parse_qsl(parsed.query))