我可以获得以下任何格式的字符串:
url:例如http://www.acme.com:456
字符串:例如www.acme.com:456,www.acme.com 456,或www.acme.com
我想提取主机,如果有端口。如果端口值不存在,我希望它默认为80。
我尝试了urlparse,它适用于网址,但不适用于其他格式。例如,当我在hostname:port上使用urlparse时,它将主机名放在scheme而不是netloc中。
我很满意使用urlparse和正则表达式的解决方案,或者可以处理这两种格式的单个正则表达式。
答案 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。你为什么不这样做:
:
urlparse
方法尽可能多地尝试使用默认功能,尤其是在解析像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