2013-04-03 9 views
27

URLs in Python zu bauen Ich brauche eine Bibliothek zu finden URLs in Python zu bauen wie:Bibliothek

http://subdomain.domain.com?arg1=someargument&arg2=someotherargument 

Welche Bibliothek würden Sie empfehlen und zu verwenden, warum? Gibt es eine "beste" Wahl für diese Art von Bibliothek?

+3

Anfragen (http://docs.python-requests.org/en/latest/) wird generell empfohlen, aber es ist kein integriertes Modul. – Moshe

+0

Das ist ok, ich frage nach jeder Bibliothek, egal ob sie eingebaut ist oder nicht. Vielen Dank! –

Antwort

18

urlparse in der Python-Standard-Bibliothek dreht sich alles um die Erstellung gültiger URLs. Überprüfen Sie die Dokumentation der URL-Adresse

+6

specifically [urlunparse] (https://docs.python.org/2/library/urlparse.html#urlparse.urlunparse) oder unsplit, um eine URL zu erstellen –

+5

urlparse wurde in urllib.parse seit python 3 verschoben: https://docs.python.org/3.5/library/urllib.parse.html?highlight=urlparse –

22

Ich würde für Python urllib gehen, es ist eine integrierte Bibliothek.

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

Ausgang:

http://domain.com/somepage/?var2=1337&var1=some_data 
+3

urllib.urlencode (getVars) – lasote

+0

Zeichenketten nicht mit '+' in Python verknüpfen. Versuchen Sie '" {} {} ". Format (url, querystring)' – spudfkc

+0

Ich stimme irgendwie zu, aber es ist ein Kompromiss. In diesem Fall sehe ich nichts falsches an der Verwendung von + für die Verkettung, und seit Python 2 gibt es nicht einmal eine Geschwindigkeitsstrafe von +. Wenn Sie jedoch den PEP8-Standard vollständig erfüllen möchten - und dadurch die Kreuzkompatibilität/Stabilität erhalten möchten, verwenden Sie besser format(), append() und join(). – chjortlund

4
import requests 
payload = {'key1':'value1', 'key2':'value2'} 
response = request.get('http://fireoff/getdata', params=payload) 
print response.url 

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

+2

Gibt es auch eine Web-Anfrage als Nebeneffekt? –

+0

@TylerLong [Ja, es tut] (http://docs.python-requests.org/en/latest/api/#main-interface). –

+27

Das entspricht der Antwort "Wie backe ich einen Kuchen?" mit "mach eine Bäckerei auf, geh hinein und frage nach Kuchen" – Ian

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

Hier ist ein Beispiel für urlparse mit URLs zu erzeugen. Dies bietet die Möglichkeit, einen Pfad zur URL hinzuzufügen, ohne sich Gedanken über das Überprüfen von Schrägstrichen machen zu müssen.

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 
Verwandte Themen