W mojej aplikacji Django muszę pobrać nazwę hosta z odsyłacza request.META.get('HTTP_REFERER')
wraz z jego protokołem, aby z adresów URL, takich jak:
- https://docs.google.com/spreadsheet/ccc?key=blah-blah-blah-blah#gid=1
- /programming/1234567/blah-blah-blah-blah
- http://www.example.com
- https://www.other-domain.com/whaters/blah/blah/?v1=0&v2=blah+blah ...
Powinienem dostać:
- https://docs.google.com/
- https://stackoverflow.com/
- http://www.example.com
- https://www.other-domain.com/
Przejrzałem inne powiązane pytania i znalazłem informacje o urlparse, ale od tego czasu to nie pomogło
>>> urlparse(request.META.get('HTTP_REFERER')).hostname
'docs.google.com'
/
do trzeciego przykładuhttp://www.domain.com
, ale myślę, że może to być wada pytania, a nie odpowiedzi.urlparse.urlparse()
zwraca nazwany wynik podobny do dwukrotnego; możesz użyć{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
dla czytelności.netloc
nie jest domeną: spróbujurlparse.urlparse('http://user:[email protected]:8080')
znaleźć części takie jak'user:pass@'
i':8080'
from urllib.parse import urlparse
https://github.com/john-kurkowski/tldextract
To jest bardziej szczegółowa wersja urlparse. Wykrywa domeny i subdomeny za Ciebie.
Z ich dokumentacji:
ExtractResult
jest nazwany trzykrotnie, więc dostęp do potrzebnych części jest prosty.źródło
Python3 przy użyciu urlsplit :
źródło
Czyste operacje na strunach :):
To wszystko, ludzie.
źródło
url.split("//")[-1].split("/")[0].split('?')[0]
:-))źródło
from urllib.parse import urlparse
.jeśli uważasz, że Twój adres URL jest prawidłowy, to będzie działać przez cały czas
źródło
split
jest złe, nie ma więcej ukośników do podziału.Czy jest coś złego w operacjach na czystych napisach:
Jeśli wolisz, aby na końcu był dołączony ukośnik, rozszerz ten skrypt trochę tak:
To prawdopodobnie można nieco zoptymalizować ...
źródło
Oto nieco ulepszona wersja:
Wynik
Skrzypce: https://pyfiddle.io/fiddle/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true
źródło
Jest to trochę tępe, ale używa
urlparse
w obu kierunkach:ten nieparzysty
("",) * 4
bit jest taki, że urlparse oczekuje sekwencji dokładnielen(urlparse.ParseResult._fields)
= 6źródło
Wiem, że to stare pytanie, ale ja też się z nim dzisiaj spotkałem. Rozwiązałem to za pomocą jednej linijki:
źródło
Wystarczy standardowa funkcja biblioteki urllib.parse.urlsplit () . Oto przykład dla Python3:
źródło
Można to rozwiązać przez re.search ()
źródło
aby uzyskać domenę / nazwę hosta i Origin *
*
Origin
jest używany wXMLHttpRequest
nagłówkachźródło
Możesz po prostu użyć urljoin z względnym korzeniem „/” jako drugim argumentem:
źródło
Jeśli zawiera mniej niż 3 ukośniki, więc masz, a jeśli nie, możemy znaleźć wystąpienie między nim:
źródło