Python urlparse。を使用して、URLからサブドメインなしでドメイン名を抽出する方法が必要です。
たとえば、"google.com"
のような完全なURLから"http://www.google.com"
を抽出したいと思います。
urlparse
で最も近いのはnetloc
属性ですが、これにはサブドメインが含まれており、この例ではwww.google.com
です。
Www.google.comをgoogle.comに変換するカスタム文字列操作を作成できることは知っていますが、このタスクでは手作業による文字列変換や正規表現を避けたいと思います。 (その理由は、カスタム解析関数の作成に必要なすべてのEdgeケースを考慮することができると確信できるほど、URL形成ルールに精通していないためです。)
または、urlparse
が必要なことを行えない場合、誰か他のPython URL解析ライブラリを知っていますか?
tldextract 、この種のことを行うために設計されたライブラリをチェックアウトしたいでしょう。
Public Suffix Listを使用して、既知のgTLDに基づいて適切な分割を試みますが、これは単なるブルートフォースリストであり、特別なものではないため、期限切れになる可能性があります(ただし、 )。
>>> import tldextract
>>> tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')
あなたの場合:
>>> extracted = tldextract.extract('http://www.google.com')
>>> "{}.{}".format(extracted.domain, extracted.suffix)
"google.com"
これは、更新された回答の報奨金リクエストに基づく更新です
tld パッケージを使用して開始します。パッケージの説明:
指定されたURLからトップレベルドメイン(TLD)を抽出します。 TLD名のリストはMozillaから取得されます http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1
from tld import get_tld
from tld.utils import update_tld_names
update_tld_names()
print get_tld("http://www.google.co.uk")
print get_tld("http://zap.co.it")
print get_tld("http://google.com")
print get_tld("http://mail.google.com")
print get_tld("http://mail.google.co.uk")
print get_tld("http://google.co.uk")
この出力
google.co.uk
zap.co.it
google.com
google.com
google.co.uk
google.co.uk
co.uk
とco.it
を残すことで国レベルのTLDを正しく処理しますが、.com
と.co.uk
の両方のwww
とmail
サブドメインを適切に削除します。
スクリプトの先頭にあるupdate_tld_names()
呼び出しは、tld名をMozillaの最新バージョンで更新/同期するために使用されます。
ドメイン名の操作には、 Dnspy を使用することもできます
Mozilla Public Suffixリストの新しいコピーを使用して、さまざまなレベルでドメイン(およびドメインラベル)を抽出するのに役立ちます。
from tld import get_tld
from tld.utils import update_tld_names
update_tld_names()
result=get_tld('http://www.google.com')
print 'https://'+result
結果:google.com
Tldexportの使用は正常に機能しますが、blogspot.comサブドメインの解析と混乱の作成中に明らかに問題が発生します。そのライブラリを使用したい場合は、サブドメインで空の文字列が返されないようにif条件または何かを実装してください。
ライブラリに(かつてMozilla)パブリックサフィックスリストをカプセル化する複数のPythonモジュールがあり、そのいくつかはdo n't入力がURLであることを要求します。特にURLの正規化についての質問ですが、私の要件はドメイン名だけを処理することでしたので、そのための接線の答えを提供します。
publicsuffix2 に対する publicsuffixlist または publicsuffix の相対的なメリットは不明ですが、それらはすべて基本的な機能を提供しているようです。
publicsuffix2:
>>> import publicsuffix # sic
>>> publicsuffix.PublicSuffixList().get_public_suffix('www.google.co.uk')
u'google.co.uk'
publicsuffix
の、おそらくよりパッケージングに適したフォーク。publicsuffixlist:
>>> import publicsuffixlist
>>> publicsuffixlist.PublicSuffixList().privatesuffix('www.google.co.uk')
'google.co.uk'
idna
サポートをアドバタイズしますが、これはテストしていません。publicsuffix:
>>> import publicsuffix
>>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk')
'google.co.uk'