Разбор имени хоста и порта из строки или 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
>>>