2012-03-02 13 views
14

mogę mieć ciąg w każdym z tych formatów:Przetwarzanie nazwę hosta i port ze sznurka lub url

Chciałbym wydobyć hosta i jeśli jest obecny port. Jeśli wartość portu nie jest obecna, chciałbym, aby wartość domyślna wynosiła 80.

Próbowałem już urlparse, która działa dobrze dla adresu URL, ale nie dla innego formatu. Kiedy używam urlparse na hostname: port na przykład, umieszcza nazwę hosta w schemacie zamiast netloc.

Byłbym zadowolony z rozwiązania, które używa urlparse i regex, lub pojedynczego wyrażenia regularnego, które może obsłużyć oba formaty.

+0

Co to jest regex próbowałeś? jeśli nie wyrecytować, jaki jest kod, który napisałeś? –

Odpowiedz

2

nie jestem zaznajomiony z urlparse, ale przy użyciu regex chcesz zrobić coś takiego:

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' 

Albo bez portu:

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: stałe wyrażenie regularne również dopasować " www.abc.com 123'

+0

Dzięki temu wygląda naprawdę przydatne. – TonyM

+2

Zakładam, że głosowanie w dół jest spowodowane zbytnim skomplikowaniem tego rozwiązania. Akceptuję to i zgadzam się z @ntziolis, mówiąc, że powinieneś spróbować użyć standardowej funkcjonalności, kiedy to możliwe. – claesv

+0

Standardowe urlparse nie będzie działać dla łańcucha znaków (nie zaczynaj się od http (ów) lub //), więc to rozwiązanie wydaje się pomocne. Po co iść bez wyjaśnienia. –

7

powodem nie jest on dla:

www.acme.com 456 

jest ponieważ nie jest prawidłowym identyfikatorem URI. Dlaczego nie po prostu:

  1. Wymień miejsca z :
  2. Analizować ciąg wynikowy za pomocą standardowego urlparse metodę

spróbować i skorzystać z domyślnej funkcjonalności jak najwięcej, szczególnie jeśli chodzi o rzeczy takie jak parsowanie dobrze znanych formatów takich jak URI.

+2

Kiedy używam urlparse na hoście: port, umieszcza nazwę hosta w schemacie, a nie na netloc. – TonyM

+2

Z podręcznika: "Zgodnie ze specyfikacjami składni w RFC 1808, urlparse rozpoznaje netloc tylko wtedy, gdy jest poprawnie wprowadzony przez" // ". W przeciwnym razie dane wejściowe są uważane za względny adres URL, a zatem zaczynają się od komponentu ścieżki." – ntziolis

+1

Aby rozwiązać ten problem, przedrostek go należy poprzedzić '//' lub 'http: //' zanim przeanalizuję – ntziolis

31

Można użyć urlparse uzyskać nazwę hosta z adresu URL ciąg:

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 
>>>