添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
阳刚的饭盒  ·  Electron 对 SQLite ...·  2 月前    · 
神勇威武的西瓜  ·  React-Native/Android ...·  11 月前    · 
茫然的雪糕  ·  超分之VESPCN-CSDN博客·  1 年前    · 
登录

在Python中向给定的URL添加参数

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2014-03-04
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2010-03-24 17:06

假设我得到了一个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

有什么标准的方法可以做到这一点吗?

浏览 416 关注 0 得票数 147
  • 得票数为Stack Overflow原文数据
原文
修改于2010-03-24
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2010-03-24 17:10
得票数 11

是:使用 urllib

从文档中的 examples

>>> import urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
>>> print f.geturl() # Prints the final URL with parameters.
>>> print f.read() # Prints the contents
回答于2010-03-24
得票数 5

使用各种 urlparse 函数拆分现有的URL,组合字典上的 urllib.urlencode() ,然后使用 urlparse.urlunparse() 将其重新组合在一起。

或者直接获取 urllib.urlencode() 的结果并将其适当地连接到URL。

修改于2020-01-29
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2010-03-24 17:15
得票数 49

如果字符串可以包含任意数据(例如,需要对与号、斜杠等字符进行编码),则需要使用URL编码。

查看urllib.urlencode:

>>> import urllib
>>> urllib.urlencode({'lang':'en','tag':'python'})
'lang=en&tag=python'

在python3中:

from urllib import parse
parse.urlencode({'lang':'en','tag':'python'})
修改于2017-09-01
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2010-03-24 17:23
得票数 201

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 ,然后才能尝试修改它的数据。

回答于2011-01-24
得票数 2

在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"
回答于2012-03-03
得票数 7

我喜欢Łukasz版本,但是由于urllib和urllparse函数在这种情况下使用起来有些笨拙,我认为这样做更简单:

params = urllib.urlencode(params)
if urlparse.urlparse(url)[4]:
    print url + '&' + params
else:
    print url + '?' + params
修改于2012-08-08
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2012-08-08 22:50
得票数 2

下面是我如何实现它的。

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
回答于2012-10-17
得票数 4

还有另一个答案:

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))
操作
回答于2014-07-17
得票数 26

您还可以使用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
修改于2017-05-23
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2015-11-26 02:39
得票数 14

基于 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)
Stack Overflow用户
修改于2018-04-10
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2017-05-15 20:02
得票数 19

如果您正在使用 requests lib

import requests
params = {'tag': 'python'}
requests.get(url, params=params)
操作
回答于2018-04-22
得票数 45

外包给经过战斗考验的 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)
评论 0
0
回答于2020-09-29
得票数 6

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