복붙노트

[PYTHON] URL에서 최상위 도메인 이름 (TLD)을 추출하는 방법

PYTHON

URL에서 최상위 도메인 이름 (TLD)을 추출하는 방법

하위 도메인을 제외한 URL에서 도메인 이름을 추출하는 방법은 무엇입니까?

나의 초기 단순한 시도는 다음과 같다.

'.'.join(urlparse.urlparse(url).netloc.split('.')[-2:])

이것은 http://www.foo.com에서는 작동하지만 http://www.foo.com.au에서는 작동하지 않습니다. 유효한 TLD (최상위 도메인) 또는 국가 코드 (변경되기 때문에)에 대한 특별한 지식을 사용하지 않고도이를 올바르게 수행 할 수있는 방법이 있습니까?

감사

해결법

  1. ==============================

    1.아니요, zap.co.uk은 하위 도메인이므로 (예 : 이탈리아의 등록 기관은 co.it과 같은 도메인을 판매하기 때문에) zap.co.uk은 그렇지 않습니다 (영국의 등록 기관 co.uk과 같은 도메인은 판매하지 않지만 zap.co.uk와 같은 도메인 만 판매합니다.)

    아니요, zap.co.uk은 하위 도메인이므로 (예 : 이탈리아의 등록 기관은 co.it과 같은 도메인을 판매하기 때문에) zap.co.uk은 그렇지 않습니다 (영국의 등록 기관 co.uk과 같은 도메인은 판매하지 않지만 zap.co.uk와 같은 도메인 만 판매합니다.)

    보조 테이블 (또는 온라인 소스)을 사용하여 영국 및 호주와 같이 특이한 행동을하는 TLD를 알려야합니다. 그런 의미 론적 지식없이 문자열을 쳐다 보지 못하게 할 수는 없습니다. 결국 변경되지만 소스가 그에 따라 적절하게 변경 될 수있는 좋은 온라인 소스를 찾을 수 있다면 희망적입니다. -).

  2. ==============================

    2.다음은이 질문을보고이 문제를 해결하기 위해 작성한 훌륭한 파이썬 모듈입니다. https://github.com/john-kurkowski/tldextract

    다음은이 질문을보고이 문제를 해결하기 위해 작성한 훌륭한 파이썬 모듈입니다. https://github.com/john-kurkowski/tldextract

    이 모듈은 Mozilla 자원 봉사자가 관리하는 Public Suffix List에서 TLD를 찾습니다.

    인용문:

  3. ==============================

    3.Mozilla 웹 사이트에서 다른 누군가가 찾은 효과적인 tld 파일을 사용하십시오.

    Mozilla 웹 사이트에서 다른 누군가가 찾은 효과적인 tld 파일을 사용하십시오.

    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. ==============================

    4.파이썬 tld 사용하기

    파이썬 tld 사용하기

    https://pypi.python.org/pypi/tld

    pip install tld
    
    from tld import get_tld
    print get_tld("http://www.google.co.uk") 
    

    또는 프로토콜없이

    from tld import get_tld
    
    get_tld("www.google.co.uk", fix_protocol=True)
    
    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=''
    # )
    
    from tld import get_fld
    
    get_fld("http://www.google.co.uk")
    # 'google.co.uk'
    
  5. ==============================

    5.많은 TLD가 있습니다. 다음은 그 목록입니다.

    많은 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. ==============================

    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. ==============================

    7.get_tld가 모든 새로운 것에 대해 업데이트 될 때까지, 나는 오류로부터 tld를 가져온다. 물론 그것은 나쁜 코드이지만 작동합니다.

    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. from https://stackoverflow.com/questions/1066933/how-to-extract-top-level-domain-name-tld-from-url by cc-by-sa and MIT license