web-dev-qa-db-ja.com

Python urlparse-サブドメインなしでドメイン名を抽出する

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解析ライブラリを知っていますか?

44
Clay Wardell

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"
57
Gareth Latty

これは、更新された回答の報奨金リクエストに基づく更新です

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.ukco.itを残すことで国レベルのTLDを正しく処理しますが、.com.co.ukの両方のwwwmailサブドメインを適切に削除します。

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

24
Andy

ドメイン名の操作には、 Dnspy を使用することもできます

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

2
sandyp
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

1
Danial Frs

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

1
Andrea Moro

ライブラリに(かつて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'
  • 更新を処理し、ダウンロードしたファイルを自分でキャッシュするための要件は、少し複雑です。
0
tripleee