Как извлечь доменное имя верхнего уровня (TLD) из URL-адреса
как бы вы извлекли доменное имя из URL-адреса, исключая любые поддомены?
Моя первоначальная упрощенная попытка:
'.'.join(urlparse.urlparse(url).netloc.split('.')[-2:])
Это работает для http://www.foo.com, но не http://www.foo.com.au.
Есть ли способ сделать это правильно, не используя специальные знания о действительных TLD (домены верхнего уровня) или коды стран (потому что они меняются).
спасибо
Ответы
Ответ 1
Нет, нет "внутреннего" способа узнать, что (например) zap.co.it
является субдоменом (поскольку регистратор Италии продает домены, такие как co.it
), а zap.co.uk
нет (поскольку британский регистратор DOESN 'T продавать домены, такие как co.uk
, но только как zap.co.uk
).
Вам просто нужно будет использовать вспомогательную таблицу (или источник в Интернете), чтобы сообщить вам, какой ДВУ ведет себя как Великобритания и Австралия - нет никакого способа угадать это, просто глядя на строку без таких дополнительных семантических знаний (из Конечно, это может измениться в конце концов, но если вы найдете хороший онлайн-источник, источник которого также изменится соответственно, можно надеяться! -).
Ответ 2
Здесь отличный модуль python, который кто-то написал, чтобы решить эту проблему, увидев этот вопрос:
https://github.com/john-kurkowski/tldextract
Модуль просматривает TLD в Public Suffix List, поддерживаемый добровольцами Mozilla
Цитата:
tldextract
, с другой стороны, знает, что все gTLD [общие домены верхнего уровня] и ccTLD [Домены верхнего уровня кода страны] выглядят путем поиска живых людей в соответствии с Публичным суффикс Список. Поэтому, учитывая URL-адрес, он знает свой поддомен из своего домена, а его домена из своего кода страны.
Ответ 3
Используя этот файл эффективных tlds, который кто-то еще нашел на веб-сайте Mozilla
from __future__ import with_statement
from urlparse import urlparse
# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tld_file:
tlds = [line.strip() for line in tld_file if line[0] not in "/\n"]
def get_domain(url, tlds):
url_elements = urlparse(url)[1].split('.')
# url_elements = ["abcde","co","uk"]
for i in range(-len(url_elements), 0):
last_i_elements = url_elements[i:]
# i=-3: ["abcde","co","uk"]
# i=-2: ["co","uk"]
# i=-1: ["uk"] etc
candidate = ".".join(last_i_elements) # abcde.co.uk, co.uk, uk
wildcard_candidate = ".".join(["*"] + last_i_elements[1:]) # *.co.uk, *.uk, *
exception_candidate = "!" + candidate
# match tlds:
if (exception_candidate in tlds):
return ".".join(url_elements[i:])
if (candidate in tlds or wildcard_candidate in tlds):
return ".".join(url_elements[i-1:])
# returns "abcde.co.uk"
raise ValueError("Domain not in global list of TLDs")
print get_domain("http://abcde.co.uk", tlds)
приводит к:
abcde.co.uk
Я был бы признателен, если бы кто-нибудь дал мне знать, какие части вышеизложенного можно переписать более питоническим способом. Например, должен быть лучший способ повторения в списке last_i_elements
, но я не мог думать об этом. Я также не знаю, лучше ли ValueError
поднять. Комментарии?
Ответ 4
Использование Python tld
https://pypi.python.org/pypi/tld
устанавливать
pip install tld
Получить имя TLD в виде строки из указанного URL
from tld import get_tld
print get_tld("http://www.google.co.uk")
co.uk
или без протокола
from tld import get_tld
get_tld("www.google.co.uk", fix_protocol=True)
co.uk
Получить TLD как объект
from tld import get_tld
res = get_tld("http://some.subdomain.google.co.uk", as_object=True)
res
# 'co.uk'
res.subdomain
# 'some.subdomain'
res.domain
# 'google'
res.tld
# 'co.uk'
res.fld
# 'google.co.uk'
res.parsed_url
# SplitResult(
# scheme='http',
# netloc='some.subdomain.google.co.uk',
# path='',
# query='',
# fragment=''
# )
Получить имя домена первого уровня в виде строки из указанного URL
from tld import get_fld
get_fld("http://www.google.co.uk")
# 'google.co.uk'
Ответ 5
Существует много, много TLD. Вот список:
http://data.iana.org/TLD/tlds-alpha-by-domain.txt
Здесь другой список
http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Здесь другой список
http://www.iana.org/domains/root/db/
Ответ 6
Вот как я его обрабатываю:
if not url.startswith('http'):
url = 'http://'+url
website = urlparse.urlparse(url)[1]
domain = ('.').join(website.split('.')[-2:])
match = re.search(r'((www\.)?([A-Z0-9.-]+\.[A-Z]{2,4}))', domain, re.I)
if not match:
sys.exit(2)
elif not match.group(0):
sys.exit(2)
Ответ 7
Пока get_tld не будет обновлен для всех новых, я вытащу tld из ошибки. Конечно, это плохой код, но он работает.
def get_tld():
try:
return get_tld(self.content_url)
except Exception, e:
re_domain = re.compile("Domain ([^ ]+) didn't match any existing TLD name!");
matchObj = re_domain.findall(str(e))
if matchObj:
for m in matchObj:
return m
raise e
Ответ 8
В Python я использовал tldextract до тех пор, пока он не потерпел неудачу с URL-адресом, таким как www.mybrand.sa.com
его как subdomain='order.mybrand', domain='sa', suffix='com'
!!
Итак, наконец, я решил написать этот метод
ВАЖНОЕ ПРИМЕЧАНИЕ: это работает только с URL, в которых есть поддомен. Это не предназначено для замены более продвинутых библиотек, таких как tldextract
def urlextract(url):
url_split=url.split(".")
if len(url_split) <= 2:
raise Exception("Full url required with subdomain:",url)
return {'subdomain': url_split[0], 'domain': url_split[1], 'suffix': ".".join(url_split[2:])}