No meu aplicativo Django, preciso obter o nome do host do referenciador, request.META.get('HTTP_REFERER')
juntamente com seu protocolo, para que, em URLs como:
- 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/whatever/blah/blah/?v1=0&v2=blah+blah ...
Eu deveria ter:
- https://docs.google.com/
- https://stackoverflow.com/
- http://www.example.com
- https://www.other-domain.com/
Examinei outras questões relacionadas e descobri o urlparse, mas isso não funcionou desde que
>>> urlparse(request.META.get('HTTP_REFERER')).hostname
'docs.google.com'
/
ao terceiro exemplohttp://www.domain.com
, mas acho que isso pode ser uma falha da pergunta, não da resposta.urlparse.urlparse()
retorna um resultado parecido com um múltiplo; você pode usar{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
para facilitar a leitura.netloc
não é de domínio: tentativaurlparse.urlparse('http://user:[email protected]:8080')
e encontrá-lo dá partes como'user:pass@'
e':8080'
from urllib.parse import urlparse
https://github.com/john-kurkowski/tldextract
Esta é uma versão mais detalhada do urlparse. Ele detecta domínios e subdomínios para você.
Da documentação deles:
ExtractResult
é um múltiplo nomeado; portanto, é fácil acessar as partes que você deseja.fonte
Python3 usando urlsplit :
fonte
Operações de cadeia pura :):
Isso é tudo, pessoal.
fonte
url.split("//")[-1].split("/")[0].split('?')[0]
:-))fonte
from urllib.parse import urlparse
.se você acha que seu URL é válido, isso funcionará o tempo todo
fonte
split
está errado, não há mais barras a serem divididas.Há algo de errado nas operações de string pura:
Se você preferir que uma barra final seja anexada, estenda esse script da seguinte maneira:
Provavelmente isso pode ser otimizado um pouco ...
fonte
Aqui está uma versão ligeiramente melhorada:
Resultado
Fiddle: https://pyfiddle.io/fiddle/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true
fonte
Isso é um pouco obtuso, mas usa
urlparse
nas duas direções:esse
("",) * 4
bit estranho é porque urlparse espera uma sequência de exatamentelen(urlparse.ParseResult._fields)
= 6fonte
Sei que é uma pergunta antiga, mas também a encontrei hoje. Resolvido isso com uma linha:
fonte
A função da biblioteca padrão urllib.parse.urlsplit () é tudo que você precisa. Aqui está um exemplo para Python3:
fonte
Pode ser resolvido por re.search ()
fonte
obter domínio / nome do host e origem *
*
Origin
é usado emXMLHttpRequest
cabeçalhosfonte
Você pode simplesmente usar urljoin com a raiz relativa '/' como segundo argumento:
fonte
Se ele contém menos de 3 barras, então você tem e, se não, então podemos encontrar a ocorrência entre elas:
fonte