Подтвердить что ты не робот

Python urlparse - вырезать доменное имя без субдомена

Требуется способ извлечь доменное имя без субдомена из URL-адреса, используя URL-адрес Python.

Например, я хотел бы извлечь "google.com" из полного URL-адреса, например "http://www.google.com".

Ближайшим я могу казаться, что urlparse является атрибутом netloc, но включает субдомен, который в этом примере будет www.google.com.

Я знаю, что можно написать некоторые пользовательские манипуляции с строкой, чтобы превратить www.google.com в google.com, но я хочу избежать непротиворечивых строковых преобразований или регулярных выражений в этой задаче. (Причина этого в том, что я недостаточно разбираюсь в правилах формирования URL-адресов, чтобы чувствовать уверенность в том, что я могу рассмотреть каждый случай края, необходимый для написания пользовательской функции синтаксического анализа.)

Или, если urlparse не может делать то, что мне нужно, знает ли кто-нибудь другие библиотеки Python для анализа URL-адресов, которые будут?

4b9b3361

Ответ 1

Вероятно, вы захотите проверить 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"

Ответ 2

Это обновление, основанное на запросе на раздачу для обновленного ответа

Начните с использования tld. Описание пакета:

Извлекает домен верхнего уровня (TLD) из указанного URL. Список 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

Обратите внимание, что он правильно обрабатывает TLD уровня страны, оставляя co.uk и co.it, но правильно удаляет субдомены www и mail для .com и .co.uk

Вызов update_tld_names() в начале script используется для обновления/синхронизации имен tld с последней версией Mozilla.

Ответ 3

Это не стандартное разложение URL-адресов.

Вы не можете полагаться на www., чтобы присутствовать или быть необязательным. Во многих случаях это не будет.

Итак, если вы хотите предположить, что релевантны только последние два компонента (что также не будет работать для uk, например www.google.co.uk), вы можете сделать split('.')[-2:].

Или, что на самом деле меньше подвержено ошибкам, разделите префикс www..

Но в любом случае вы не можете предположить, что www. является необязательным, потому что он НЕ будет работать каждый раз!

Вот список общих суффиксов для доменов. Вы можете попытаться сохранить суффикс + один компонент.

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

Но как вы планируете обрабатывать, например, first.last.name домены? Предположим, что все пользователи с одинаковой фамилией - это одна и та же компания? Первоначально вы могли бы получить там домены третьего уровня. К настоящему моменту вы, очевидно, тоже можете получить второй уровень. Таким образом, для .name не существует общего правила.

Ответ 4

Для манипуляции с доменными именами вы также можете использовать Dnspy

Он помогает извлекать домены (и метки доменов) на разных уровнях, используя новую копию списка публичного суффикса Mozilla.

Ответ 5

Использование tldexport отлично работает, но, видимо, имеет проблему при разборе поддомена blogspot.com и создает беспорядок. Если вы хотите продолжить работу с этой библиотекой, обязательно выполните условие if или что-то, чтобы предотвратить возврат пустой строки в поддомен.

Ответ 6

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

Ответ 7

Существует несколько модулей Python, которые инкапсулируют (как только Mozilla) Public Suffix List в библиотеку, некоторые из которых не требуют ввода 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'
  • Требование для обработки обновлений и кэширования загруженного файла является немного сложным.