Что означает «слишком медленно для большого количества операций»? Это все еще будет работать в постоянное время (для каждого URL), и вы не можете стать лучше, чем это. Вышесказанное кажется вполне хорошим способом сделать это.
Если вам нужно, чтобы это было немного быстрее (но это не было бы ужасно быстрее), вы можете написать свое собственное регулярное выражение. Что-то вроде "[a-zA-Z]+://([a-zA-Z0-9.]+)"
. Это позволило бы получить полный домен, а не поддомен. Вам все равно нужно будет выполнить разбиение домена, если вы не можете использовать предпросмотр в регулярном выражении, чтобы получить только последние два сегмента. Обязательно используйте re.compile
, чтобы сделать само регулярное выражение быстрым.
Обратите внимание, что domain[-2]
, вероятно, не будет тем, что вы хотите. Логика поиска подходящего «домена уровня компании» довольно сложна. Например, если домен google.com.au, это даст вам «com.au», что вряд ли будет тем, что вы хотите - вы, вероятно, хотите «google.com.au».
Поскольку вы говорите, что идеальное решение будет обрабатывать любой поддомен, вы, вероятно, захотите перебрать все разбиения.
url = urlparse.urlparse(response.url)
domain = url.netloc # 'www.google.com'
domain = domain.split(".") # ['www', 'google', 'com']
info = None
for i in range(len(domain)):
subdomain = ".".join(domain[i:]) # 'www.google.com', 'google.com', 'com'
try:
info = domain_info[subdomain]
break
except KeyError:
pass
С помощью приведенного выше кода вы найдете его, если он соответствует какому-либо поддомену. Что касается чувствительности к регистру, это легко. Убедитесь, что все ключи в словаре строчные, и примените .lower()
к домену перед всей другой обработкой.