2012-03-02 39 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 
>>>