En mi aplicación Django, necesito obtener el nombre de host del referente request.META.get('HTTP_REFERER')
junto con su protocolo para que de URL 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 ...
Debería obtener:
- https://docs.google.com/
- https://stackoverflow.com/
- http://www.example.com
- https://www.other-domain.com/
Revisé otras preguntas relacionadas y encontré sobre urlparse, pero eso no funcionó ya que
>>> urlparse(request.META.get('HTTP_REFERER')).hostname
'docs.google.com'
/
al tercer ejemplohttp://www.domain.com
, pero creo que esto podría ser una deficiencia de la pregunta, no de la respuesta.urlparse.urlparse()
devuelve un resultado con nombre de tupla; podría usar{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
para facilitar la lectura.netloc
que no es un dominio: intenteurlparse.urlparse('http://user:[email protected]:8080')
y encuentre que le da partes como'user:pass@'
y':8080'
from urllib.parse import urlparse
https://github.com/john-kurkowski/tldextract
Esta es una versión más detallada de urlparse. Detecta dominios y subdominios por ti.
De su documentación:
ExtractResult
es una tupla nombrada, por lo que es fácil acceder a las partes que desea.fuente
Python3 usando urlsplit :
fuente
Operaciones de cadena pura :):
Eso es todo amigos.
fuente
url.split("//")[-1].split("/")[0].split('?')[0]
:-))fuente
from urllib.parse import urlparse
.si crees que tu url es válida, esto funcionará todo el tiempo
fuente
split
está mal, no hay más barras diagonales para dividir.¿Hay algo malo con las operaciones de cadena pura:
Si prefiere que se agregue una barra inclinada final, extienda este script un poco así:
Eso probablemente se puede optimizar un poco ...
fuente
Aquí hay una versión ligeramente mejorada:
Salida
Fiddle: https://pyfiddle.io/fiddle/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true
fuente
Esto es un poco obtuso, pero se usa
urlparse
en ambas direcciones:ese
("",) * 4
bit extraño se debe a que urlparse espera una secuencia de exactamentelen(urlparse.ParseResult._fields)
= 6fuente
Sé que es una vieja pregunta, pero también la encontré hoy. Resuelto esto con una frase:
fuente
La función de biblioteca estándar urllib.parse.urlsplit () es todo lo que necesita. Aquí hay un ejemplo para Python3:
fuente
Podría resolverse mediante re.search ()
fuente
para obtener dominio / nombre de host y origen *
*
Origin
se usa enXMLHttpRequest
encabezadosfuente
Simplemente puede usar urljoin con la raíz relativa '/' como segundo argumento:
fuente
Si contiene menos de 3 barras, entonces lo tienes y si no, entonces podemos encontrar la aparición entre ellas:
fuente