web-dev-qa-db-ja.com

文字列またはURLからのホスト名とポートの解析

次のいずれかの形式の文字列を指定できます。

ホストおよび存在する場合はポートを抽出します。ポート値が存在しない場合は、デフォルトで80に設定します。

私は rlparse を試しましたが、これはurlでは正常に機能しますが、他の形式では機能しません。たとえば、hostname:portでurlparseを使用すると、netlocではなくスキームにホスト名が配置されます。

私はurlparseと正規表現を使用するソリューション、または両方の形式を処理できる単一の正規表現に満足しています。

21
TonyM

私は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」にも一致するように正規表現を修正

6
claesv

Urlparseを使用して、URL文字列からホスト名を取得できます。

from urlparse import urlparse
print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com
45
Maksym Kozlenko
>>> from urlparse import urlparse   
>>> aaa = urlparse('http://www.acme.com:456')

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

>>> aaa.port   
456
>>> 
12
dfostic

それが失敗する理由:

www.acme.com 456

これは有効なURIではないためです。なぜあなただ​​けではないのですか?

  1. スペースを:に置き換えます
  2. 標準のurlparseメソッドを使用して、結果の文字列を解析します

特にURIのようなよく知られているフォーマットの解析などに関しては、デフォルトの機能をできる限り使用してください。

7
ntziolis

urllibを使用するメソッド-

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

出力-

ParseResult(scheme = 'https'、netloc = 'stackoverflow.com'、path = '/ questions'、params = ''、query = '' 、フラグメント= '')

リファレンス- https://www.tutorialspoint.com/urllib-parse-parse-urls-into-components-in-python

1
StukedCoder