用Python构建URL的库

Ser*_*rán 55 python

我需要找到一个库来构建python中的URL,如:

http://subdomain.domain.com?arg1=someargument&arg2=someotherargument
Run Code Online (Sandbox Code Playgroud)

您会建议使用哪个库?为什么?这种图书馆有"最佳"选择吗?

chj*_*und 48

我会选择Python urllib,它是一个内置库.

# Python 2:
import urllib

# Python 3:
# import urllib.parse

getVars = {'var1': 'some_data', 'var2': 1337}
url = 'http://domain.com/somepage/?'

# Python 2:
print(url + urllib.urlencode(getVars))

# Python 3:
# print(url + urllib.parse.urlencode(getVars))
Run Code Online (Sandbox Code Playgroud)

输出:

http://domain.com/somepage/?var2=1337&var1=some_data
Run Code Online (Sandbox Code Playgroud)

  • urllib.urlencode(getVars) (4认同)
  • 我有点同意,但这是一个权衡。在这种情况下,我认为使用+进行串联没有任何问题,而且由于Python 2的使用,甚至没有速度上的损失。但是,如果您想完全符合PEP8标准,并通过这种方式获得交叉兼容性/稳定性,那么最好使用format(),append()和join()。 (4认同)
  • 不要在python中用`+`连接字符串。尝试`“ {} {}”。format(url,querystring)` (3认同)

Sen*_*ran 31

urlparse在python标准库中,所有关于构建有效的URL.查看urlparse的文档

  • 自python 3以来,urlparse已被移动到urllib.parse:https://docs.python.org/3.5/library/urllib.parse.html?highlight = urlparse (19认同)
  • 特别是[urlunparse](https://docs.python.org/2/library/urlparse.html#urlparse.urlunparse)或unsplit来构建网址 (12认同)
  • 例如urllib.parse.urlunparse((('http','example.com','/ path',None,'a = 1','fragment')))`。 (3认同)
  • 该库仅为您提供构建有效URL的最原始的组件。您必须了解如何组装这些组件。例如,urlunparse使用“ netloc”,即“ username:password @ host:port”,并且您需要对密码进行URL编码,然后将字符串内插到“ netloc”字符串中(否则密码包含通用密码)。特殊字符会破坏您的程序)。同样,您必须将查询字典转换为字符串,并注意适当地对URL进行编码。如果您正在寻找一个健全的库来构建有效的URL,那不是吗。 (2认同)

Mic*_*n G 10

以下是urlparse用于生成URL 的示例.这样可以方便地添加URL的路径,而无需担心检查斜杠.

import urllib
import urlparse

def build_url(baseurl, path, args_dict):
    # Returns a list in the structure of urlparse.ParseResult
    url_parts = list(urlparse.urlparse(baseurl))
    url_parts[2] = path
    url_parts[4] = urllib.urlencode(args_dict)
    return urlparse.urlunparse(url_parts)

args = {'arg1': 'value1', 'arg2': 'value2'}
# works with double slash scenario
url1 = build_url('http://www.example.com/', '/somepage/index.html', args)
print(url1)

>>> http://www.example.com/somepage/index.html?arg1=value1&arg2=value2

# works without slash
url2 = build_url('http://www.example.com', 'somepage/index.html', args)
print(url2)

>>> http://www.example.com/somepage/index.html?arg1=value1&arg2=value2
Run Code Online (Sandbox Code Playgroud)


use*_*693 6

import requests
payload = {'key1':'value1', 'key2':'value2'}
response =  requests.get('http://fireoff/getdata', params=payload)
print response.url
Run Code Online (Sandbox Code Playgroud)

打印: http:// fireoff / getdata?key1 = value1&key2 = value2

  • 这类似于回答“我如何烤蛋糕?” “开一​​家面包店,走进去,然后吃蛋糕” (47认同)
  • 如果您想使用出色的请求库,可以尝试如下操作:`requests.Request('GET','https://example.com/api',params = dict(param1 ='arg1',param2 =' arg2'))。prepare()。url` (6认同)
  • 是否还会发出Web请求作为副作用? (3认同)

小智 6

import urllib

def make_url(base_url , *res, **params):
    url = base_url
    for r in res:
        url = '{}/{}'.format(url, r)
    if params:
        url = '{}?{}'.format(url, urllib.urlencode(params))
    return url

>>>print make_url('http://example.com', 'user', 'ivan', aloholic='true', age=18)

http://example.com/user/ivan?age=18&aloholic=true
Run Code Online (Sandbox Code Playgroud)