55

Python urlparseを使用して、URLからサブドメインなしでドメイン名を抽出する方法が必要です。

たとえば、のよう"google.com"な完全なURLから抽出したいと思い"http://www.google.com"ます。

私が持っていると思われる最も近いものurlparsenetloc属性ですが、これにはサブドメインが含まれています。この例では、これはですwww.google.com

www.google.comをgoogle.comに変換するカスタム文字列操作を作成できることは知っていますが、このタスクでは手動による文字列変換や正規表現を避けたいと思います。(この理由は、カスタム解析関数を作成する際に必要なすべてのエッジケースを検討できると確信できるほど、URL形成ルールに精通していないためです。)

または、urlparse私が必要なことを実行できない場合、誰かが他のPython URL解析ライブラリを知っていますか?

4

7 に答える 7

75

この種のことを行うために設計されたライブラリであるtldextractをチェックしてみてください。

パブリックサフィックスリストを使用して、既知の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"
于 2013-01-18T19:38:35.500 に答える
25

これは、更新された回答のバウンティリクエストに基づく更新です

tldパッケージを使用することから始めます。パッケージの説明:

指定されたURLからトップレベルドメイン(TLD)を抽出します。TLD名のリストは、Mozillahttp ://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とを残すことで国レベルのTLDを正しく処理しますが、との両方のサブドメインを適切に削除することに注意してくださいco.itwwwmail.com.co.uk

スクリプトの最初のupdate_tld_names()呼び出しは、tld名をMozillaの最新バージョンで更新/同期するために使用されます。

于 2014-03-06T14:59:52.120 に答える
7

これは、URLの標準的な分解ではありません。

www.が存在するか、オプションであるかを信頼することはできません。多くの場合、そうではありません。

したがって、最後の2つのコンポーネントのみが関連していると想定したい場合(たとえば、英国では機能しませんwww.google.co.uk)、を実行できますsplit('.')[-2:]

または、実際にはエラーが発生しにくいので、www.プレフィックスを削除します。

しかし、どちらの方法でも、毎回機能するとは限らないため、がオプションであると想定することはできません。www.

ドメインの一般的なサフィックスのリストは次のとおりです。接尾辞+1つのコンポーネントを保持するように試みることができます。

https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

しかし、たとえばfirst.last.nameドメインをどのように処理する予定ですか?同じ名前のすべてのユーザーが同じ会社であると想定しますか?最初は、そこでは第3レベルのドメインしか取得できませんでした。今では、あなたも明らかに2番目のレベルを取得することができます。したがって、.name一般的な規則はありません。

于 2013-01-18T19:36:27.747 に答える
2

ドメイン名の操作には、Dnspyを使用することもできます(免責事項:私はこのライブラリを作成しました)

これは、Mozilla Public Suffixリストの新しいコピーを使用して、さまざまなレベルでドメイン(およびドメインラベル)を抽出するのに役立ちます。

于 2014-02-24T21:33:02.060 に答える
1

tldexportの使用は問題なく機能しますが、blogspot.comサブドメインの解析中に問題が発生し、混乱が生じるようです。そのライブラリを使用したい場合は、サブドメインに空の文字列が返されないように、if条件などを実装してください。

于 2013-08-18T19:37:10.803 に答える
0
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

入力:http ://www.google.com

結果:google.com

于 2015-01-21T09:57:14.247 に答える
0

ライブラリに(かつてのMozilla)パブリックサフィックスリストをカプセル化する複数のPythonモジュールがあり、そのうちのいくつかは入力がURLである必要はありません。質問はURLの正規化について具体的に尋ねていますが、私の要件はドメイン名だけを処理することだったので、それに対する接線の答えを提供します。

publicsuffixlistまたはpublicsuffixに対するpublicsuffix2の相対的なメリットは明確ではありませが、すべて基本的な機能を提供しているようです。

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'
  • 更新を処理し、ダウンロードしたファイルを自分でキャッシュするという要件は、少し複雑です。
于 2017-03-29T10:56:05.710 に答える