2012-03-02 12 views
14

posso avere una stringa in uno dei seguenti formati:Analisi hostname e la porta dalla stringa o url

Vorrei estrarre l'host e se presente una porta. Se il valore della porta non è presente, mi piacerebbe che fosse impostato su 80.

Ho provato urlparse, che funziona bene per l'url, ma non per l'altro formato. Quando uso urlparse su hostname: port per esempio, inserisce il nome host nello schema piuttosto che netloc.

Sarei felice con una soluzione che utilizza urlparse e un'espressione regolare o una singola regex che possa gestire entrambi i formati.

+0

ciò che è l'espressione regolare hai provato? se non regex qual è il codice che hai scritto? –

risposta

2

Io non sono che la familiarità con urlparse, ma utilizzando regex faresti qualcosa di simile:

p = '(?:http.*://)?(?P<host>[^:/ ]+).?(?P<port>[0-9]*).*' 

m = re.search(p,'http://www.abc.com:123/test') 
m.group('host') # 'www.abc.com' 
m.group('port') # '123' 

Oppure, senza porto:

m = re.search(p,'http://www.abc.com/test') 
m.group('host') # 'www.abc.com' 
m.group('port') # '' i.e. you'll have to treat this as '80' 

EDIT: regex per abbinare anche 'fisso www.abc.com 123'

+0

Grazie, sembra davvero utile. – TonyM

+2

Sto assumendo che i voti negativi siano dovuti a questa soluzione che è eccessivamente complicata. Lo accetto e sono d'accordo con @ntziolis nel dire che dovresti provare a utilizzare le funzionalità standard quando possibile. – claesv

+0

L'urlparse standard non funziona per la stringa (non inizia con http (s) o //) quindi questa soluzione sembra utile. Perché downvotare senza spiegare. –

7

La ragione per cui non riesce per:

www.acme.com 456 

è perché non è un URI valido. Perché non basta:

  1. sostituire lo spazio con un :
  2. analizzare la stringa risultante usando il metodo standard urlparse

cercare di fare uso di funzionalità di default, per quanto possibile, specialmente quando si parla di cose come l'analisi, si conoscono formati come gli URI.

+2

Quando uso urlparse su host: port inserisce il nome host nello schema piuttosto che netloc. – TonyM

+2

Dal manuale: "Seguendo le specifiche della sintassi in RFC 1808, urlparse riconosce un netloc solo se è correttamente introdotto da" // ", altrimenti si presume che l'input sia un URL relativo e quindi inizi con un componente di percorso." – ntziolis

+1

Per risolvere questo problema, basta anteporre "//" o "http: //" prima di analizzare – ntziolis

31

È possibile utilizzare urlparse per ottenere hostname da stringa URL:

from urlparse import urlparse 
print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com 
4
>>> from urlparse import urlparse 
>>> aaa = urlparse('http://www.acme.com:456') 

>>> aaa.hostname 
'www.acme.com' 

>>> aaa.port 
456 
>>>