Разбор имени хоста и порта из строки или URL - PullRequest
19 голосов
/ 02 марта 2012

Мне может быть задана строка в любом из следующих форматов:

  • url: например, http://www.acme.com:456

  • строка: например, www.acme.com:456, www.acme.com 456 или www.acme.com

Я хотел бы извлечь хост и, если он присутствует, порт. Если значение порта отсутствует, я бы хотел установить значение по умолчанию 80.

Я попытался urlparse , который отлично работает для URL, но не для другого формата. Когда я использую urlparse для hostname: port, например, он помещает имя хоста в схему, а не netloc.

Я был бы рад решению, использующему urlparse и регулярное выражение, или одному регулярному выражению, которое могло бы обрабатывать оба формата.

Ответы [ 4 ]

41 голосов
/ 21 июля 2013

Вы можете использовать urlparse для получения имени хоста из строки URL:

from urlparse import urlparse
print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com
9 голосов
/ 08 января 2015
>>> from urlparse import urlparse   
>>> aaa = urlparse('http://www.acme.com:456')

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

>>> aaa.port   
456
>>> 
7 голосов
/ 02 марта 2012

Причина сбоя:

www.acme.com 456

заключается в том, что это недопустимый URI.Почему бы вам просто:

  1. Заменить пробел на :
  2. Разобрать полученную строку с помощью стандартного urlparse метода

Старайтесь максимально использовать функциональность по умолчанию, особенно когда речь идет о таких вещах, как анализ хорошо известных форматов, таких как URI.

3 голосов
/ 02 марта 2012

Я не очень знаком с urlparse, но с помощью регулярных выражений вы могли бы сделать что-то вроде:

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'

Или без порта:

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'

РЕДАКТИРОВАТЬ: исправлено регулярное выражение длятакже соответствует 'www.abc.com 123'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...