2011-12-02 19 views

risposta

36

Python 2

È possibile utilizzare il modulo urlparse per analizzare un URL e quindi è possibile controllare se è relativo o assoluto per controllando se ha impostato il nome host.

>>> import urlparse 
>>> def is_absolute(url): 
...  return bool(urlparse.urlparse(url).netloc) 
... 
>>> is_absolute('http://www.example.com/some/path') 
True 
>>> is_absolute('//www.example.com/some/path') 
True 
>>> is_absolute('/some/path') 
False 

Python 3

urlparse è stato spostato a urllib.parse, in modo da utilizzare il seguente:

from urllib.parse import urlparse 

def is_absolute(url): 
    return bool(urlparse(url).netloc) 
+1

Non dovremmo considerare anche 'www.esempio.com/alcuni/percorso' come abolito? – Geo

+1

Ufficialmente, questo è un URL relativo con l'intera stringa come percorso. Se vuoi che sia considerato assoluto, devi aggiungere "http: //" con qualche pre-elaborazione o non usare "urlparse". –

+2

Secondo RFC '// google.com' è un url relativo al protocollo. E il tuo codice restituirà 'False' per questo. – Nik

17

Se vuoi sapere se un URL è assoluto o relativo al fine di aderire con un URL di base, di solito faccio urlparse.urljoin comunque:

>>> from urlparse import urljoin 
>>> urljoin('http://example.com/', 'http://example.com/picture.png') 
'http://example.com/picture.png' 
>>> urljoin('http://example1.com/', '/picture.png') 
'http://example1.com/picture.png' 
>>> 
+3

Si scopre che questo è ciò che volevo fare - si tratta del primo URL, il valore predefinito per tutte le parti non specificate del secondo URL. Se il secondo è assoluto, usa solo quello. – rescdsk

-1

Non sei sicuro di quello che stai chiedendo circa. Stai solo cercando di vedere se inizia con http://? Se è così, una semplice regex farà il trucco.

(EDIT: vedi commento qui sotto - un ottimo punto !!)

+3

Si prega di NON usare una regex solo per verificare che una stringa inizi con qualche prefisso conosciuto. Usa il metodo 'startswith' di una stringa per quello. –

+0

Inoltre, il controllo dell'URL è un po 'più complesso del semplice controllo di un determinato prefisso. – rplnt

1

Non posso commentare risposta accettata, quindi scrivere questo commento come nuova risposta: schema IMO controllo nella risposta accettata (bool(urlparse.urlparse(url).scheme)) non è una buona idea a causa di http://example.com/file.jpg, https://example.com/file.jpg e //example.com/file.jpg sono URL assoluti ma in ultimo caso otteniamo schema = ''

Io uso questo codice:

is_absolute = True if '//' in my_url else False

+0

AFAIK // foo/bar è un URL relativo valido. Con "relativo" che significa "senza schema e netloc". – guettli

Problemi correlati