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

时间:2012-03-02 09:37:30

标签: python regex parsing

我可以获得以下任何格式的字符串:

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

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

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

5 个答案:

答案 0 :(得分:39)

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

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

答案 1 :(得分:7)

失败的原因:

www.acme.com 456

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

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

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

答案 2 :(得分:7)

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

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

>>> aaa.port   
456
>>> 

答案 3 :(得分:3)

我对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'

答案 4 :(得分:1)

使用 urllib -

的方法
    from urllib.parse import urlparse
    url = 'https://stackoverflow.com/questions'
    print(urlparse(url))

输出-

ParseResult(scheme ='https', netloc ='stackoverflow.com', path ='/ questions',params ='',query ='',fragment =“'')

参考-https://www.tutorialspoint.com/urllib-parse-parse-urls-into-components-in-python