def tld(self, host): """ Public method to get the top level domain for a host. @param host host name to get TLD for @type str @return TLD for host @rtype str """ if not host or host.startswith("."): return "" cleanHost = self.__normalizedHost(host) tldPart = cleanHost[cleanHost.rfind(".") + 1:] cleanHost = bytes(QUrl.toAce(cleanHost)).decode("utf-8") self.__loadData() if tldPart not in self.__tldDict: return tldPart tldRules = self.__tldDict[tldPart][:] if tldPart not in tldRules: tldRules.append(tldPart) maxLabelCount = 0 isWildcardTLD = False for rule in tldRules: labelCount = rule.count(".") + 1 if rule.startswith("!"): rule = rule[1:] rule = bytes(QUrl.toAce(rule)).decode("utf-8") # matches with exception TLD if cleanHost.endswith(rule): tldPart = rule[rule.find(".") + 1:] break if rule.startswith("*"): rule = rule[1:] if rule.startswith("."): rule = rule[1:] isWildcardTLD = True else: isWildcardTLD = False rule = bytes(QUrl.toAce(rule)).decode("utf-8") testRule = "." + rule testUrl = "." + cleanHost if labelCount > maxLabelCount and testUrl.endswith(testRule): tldPart = rule maxLabelCount = labelCount if isWildcardTLD: temp = cleanHost temp = temp[:temp.rfind(tldPart)] if temp.endswith("."): temp = temp[:-1] temp = temp[temp.rfind(".") + 1:] if temp: tldPart = temp + "." + rule else: tldPart = rule temp = self.__normalizedHost(host) tldPart = ".".join( temp.split(".")[temp.count(".") - tldPart.count("."):]) return tldPart