Разбор имени хоста и порта из строки или URL-адреса

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

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

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

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

Ответы

Ответ 1

Я не знаком с urlparse, но с помощью regex вы бы сделали что-то вроде:

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'

EDIT: исправлено регулярное выражение, также соответствующее "www.abc.com 123"

Ответ 2

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

from urlparse import urlparse
print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com

Ответ 3

Причина, по которой он терпит неудачу:

www.acme.com 456

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

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

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

Ответ 4

>>> from urlparse import urlparse   
>>> aaa = urlparse('http://www.acme.com:456')

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

>>> aaa.port   
456
>>>