2012-03-02 38 views
14

我可以在任何这些格式被赋予的字符串:解析主机名和端口从字符串或URL

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

我试过urlparse,它可以正常工作,但不适用于其他格式。例如,当我在主机名:端口上使用urlparse时,它将主机名放在方案中而不是netloc中。

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

+0

什么是正则表达式你试过吗?如果不是正则表达式,你写的代码是什么? – 2012-03-02 10:06:27

回答

2

我没那么熟悉里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'

+0

谢谢,这看起来非常有用。 – TonyM 2012-03-02 10:11:46

+2

我假设倒票是因为这个解决方案过于复杂。我接受这一点,并同意@ntziolis说,你应该尽可能使用标准功能。 – claesv 2014-02-17 10:11:06

+0

标准urlparse不会用于字符串(不是以http(s)或//开头),所以这个解决方案似乎很有帮助。为什么downvote没有解释。 – 2017-01-24 23:29:33

7

失败对于其原因是:

www.acme.com 456 

是因为它不是一个有效的URI。你为什么不只是:

  1. :
  2. 更换的空间使用标准urlparse方法

尝试解析生成的字符串,并使用默认的功能尽可能地,尤其是当涉及诸如URI之类的很好解析格式时。

+2

当我在主机:端口上使用urlparse时,它将主机名放在方案中而不是netloc中。 – TonyM 2012-03-02 10:06:45

+2

在手册中:“遵循RFC 1808中的语法规范,urlparse只有在正确引入'//'时才能识别netloc。否则,输入被假定为相对URL,因此以路径组件开头。 – ntziolis 2012-03-02 10:12:09

+1

为了解决这个问题,只需在解析之前用''''或'http://'作为前缀即可。 – ntziolis 2012-03-02 10:13:25

31

可以使用向里urlparse从URL字符串得到主机名:

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