从字符串或url解析主机名和端口

Ton*_*nyM 21 python regex parsing

我可以给出以下任何格式的字符串:

我想提取主机,如果有一个端口.如果端口值不存在,我希望它默认为80.

我已经尝试了urlparse,它适用于url,但不适用于其他格式.例如,当我在hostname:port上使用urlparse时,它将主机名放在scheme而不是netloc中.

我会很高兴使用urlparse和正则表达式的解决方案,或者可以处理这两种格式的单个正则表达式.

Mak*_*nko 43

您可以使用urlparse从URL字符串中获取主机名:

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

  • 在 Python3 中使用:`import urllib` 和 `urllib.parse.urlparse('http://....')` (8认同)

dfo*_*tic 11

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

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

>>> aaa.port   
456
>>> 
Run Code Online (Sandbox Code Playgroud)

  • @RodrigoLaguna Real 迟到了,但这是一个悬而未决的问题。`urlparse('www.acme.com:456')` 和 `urlparse('http://www.acme.com:456')` 之间是有区别的。从文档中,urlparse 假定一个符合 RFC1808 的 URL,并且不会正确识别网络位置,除非它是用 `//` 引入的 - https://docs.python.org/2/library/urlparse.html#urlparse .urlparse。 (2认同)

ntz*_*lis 7

它失败的原因是:

www.acme.com 456
Run Code Online (Sandbox Code Playgroud)

是因为它不是有效的URI.你为什么不这样做:

  1. 用a替换空格 :
  2. 使用标准urlparse方法解析生成的字符串

尽可能多地尝试使用默认功能,特别是在解析像URI这样的知名格式时.

  • 当我在host:port上使用urlparse时,它将主机名放在scheme而不是netloc中. (3认同)
  • 从手册:"按照RFC 1808中的语法规范,urlparse只有在'//'正确引入时才识别netloc.否则输入被认为是相对URL,因此以路径组件开头." (2认同)
  • 我不是说这是错的,但它似乎不是处理hostname:port格式的最佳方式.并且添加前缀似乎并不优雅. (2认同)
  • 基本上它可以归结为:1.在解析之前(使用标准函数)或2.你尝试使用正则表达式或类似的东西来处理解析时的不同格式.根据我的经验,标准化更好,因为正则表达式解决方案容易出错+您正在复制现有功能. (2认同)

cla*_*esv 5

我对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'
Run Code Online (Sandbox Code Playgroud)

或者,没有端口:

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'
Run Code Online (Sandbox Code Playgroud)

编辑:固定正则表达式也匹配“ www.abc.com 123”

  • 对于具有文字 IPv6 地址的 URL,例如“http://[2001:db8:85a3::8a2e:370:7334]:80/test”,此操作会失败。 (3认同)
  • 我认为投票否定是因为该解决方案过于复杂。我接受这一观点,并同意@ntziolis的观点,即您应尽可能尝试使用标准功能。 (2认同)