210 votes

Obtenir le protocole + le nom d'hôte à partir de l'URL

Dans mon application Django, j'ai besoin de récupérer le nom de l'hôte à partir du référent dans le champ request.META.get('HTTP_REFERER') ainsi que son protocole, de sorte que des URL comme :

Je devrais avoir :

J'ai regardé d'autres questions connexes et j'ai trouvé urlparse, mais cela n'a pas fait l'affaire car

>>> urlparse(request.META.get('HTTP_REFERER')).hostname
'docs.google.com'

15voto

famzah Points 400

La fonction de la bibliothèque standard urllib.parse.urlsplit() est tout ce dont vous avez besoin. Voici un exemple pour Python3 :

>>> import urllib.parse
>>> o = urllib.parse.urlsplit('https://user:pass@www.example.com:8080/dir/page.html?q1=test&q2=a2#anchor1')
>>> o.scheme
'https'
>>> o.netloc
'user:pass@www.example.com:8080'
>>> o.hostname
'www.example.com'
>>> o.port
8080
>>> o.path
'/dir/page.html'
>>> o.query
'q1=test&q2=a2'
>>> o.fragment
'anchor1'
>>> o.username
'user'
>>> o.password
'pass'

9voto

ZeroErr0r Points 1606

Si vous pensez que votre url est valide, cela fonctionnera tout le temps.

domain = "http://google.com".split("://")[1].split("/")[0]

6voto

Faiz Points 1660

Voici une version légèrement améliorée :

urls = [
    "http://stackoverflow.com:8080/some/folder?test=/questions/9626535/get-domain-name-from-url",
    "Stackoverflow.com:8080/some/folder?test=/questions/9626535/get-domain-name-from-url",
    "http://stackoverflow.com/some/folder?test=/questions/9626535/get-domain-name-from-url",
    "https://StackOverflow.com:8080?test=/questions/9626535/get-domain-name-from-url",
    "stackoverflow.com?test=questions&v=get-domain-name-from-url"]
for url in urls:
    spltAr = url.split("://");
    i = (0,1)[len(spltAr)>1];
    dm = spltAr[i].split("?")[0].split('/')[0].split(':')[0].lower();
    print dm

Sortie

stackoverflow.com
stackoverflow.com
stackoverflow.com
stackoverflow.com
stackoverflow.com

Violon : https://pyfiddle.io/fiddle/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true

5voto

Simon Steinberger Points 1787

Y a-t-il quelque chose de mal à effectuer des opérations sur des chaînes de caractères pures ?

url = 'http://stackoverflow.com/questions/9626535/get-domain-name-from-url'
parts = url.split('//', 1)
print parts[0]+'//'+parts[1].split('/', 1)[0]
>>> http://stackoverflow.com

Si vous préférez qu'une barre oblique soit ajoutée, étendez ce script un peu comme ceci :

parts = url.split('//', 1)
base = parts[0]+'//'+parts[1].split('/', 1)[0]
print base + (len(url) > len(base) and url[len(base)]=='/'and'/' or '')

Cela peut probablement être optimisé un peu ...

3voto

Orix Au Yeung Points 71

Je sais que c'est une vieille question, mais je l'ai aussi rencontrée aujourd'hui. J'ai résolu le problème avec une seule phrase :

import re
result = re.sub(r'(.*://)?([^/?]+).*', '\g<1>\g<2>', url)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X