2011-02-06 32 views
6

Tôi có danh sách các tên miền, ví dụ:Trích xuất tên miền cấp 2 khỏi miền? - Python

  • site.co.uk

  • site.com

  • site.me.uk

  • site.jpn.com

  • site.org. uk

  • site.it

cũng tên miền có thể chứa tên miền cấp 3 và cấp 4, ví dụ:

  • test.example.site.org.uk

  • test2.site.com

tôi cần phải cố gắng và trích xuất các tên miền cấp 2, trong tất cả những trường hợp này là site


Bất kỳ ý tưởng nào? :)

+0

thẻ jQuery là gì? – jAndy

+0

Tương tự như: http://stackoverflow.com/questions/1066933/python-extract-domain-name-from-url –

Trả lời

8

không có cách nào để nhận được điều đó một cách đáng tin cậy. Tên miền phụ là tùy ý và có một danh sách quái vật của các đuôi mở rộng tên miền phát triển mỗi ngày. Trường hợp tốt nhất là bạn kiểm tra danh sách quái vật của các phần mở rộng tên miền và duy trì danh sách.

danh sách: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

+0

danh sách quái vật ở đâu? : | – RadiantHex

+0

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

+0

cảm ơn bạn! Nếu bạn có thể đặt danh sách đó trong câu trả lời của bạn, tôi sẽ rất vui khi đánh dấu vào nó! :) – RadiantHex

3

Sự cố khi kết hợp các phép nhổ răng 1 và 2.

Giải pháp tầm thường ...

Xây dựng danh sách các hậu tố trang web có thể, được sắp xếp từ trường hợp thu hẹp đến phổ biến. "co.uk", "uk", "co.jp", "jp", "com"

Và kiểm tra, Hậu tố có thể được khớp ở cuối miền hay không. nếu phù hợp, phần tiếp theo là trang web.

2

Cách duy nhất có thể là thông qua danh sách có tất cả tên miền cấp cao nhất (ở đây như .com hoặc co.uk) có thể. Sau đó, bạn sẽ quét qua danh sách này và kiểm tra. Tôi không thấy bất kỳ cách nào khác, ít nhất là không truy cập internet khi chạy.

+1

Bạn cần danh sách, ngay cả khi truy cập Internet vào thời gian chạy. Quyết định bán tên miền cấp ba hoặc tên miền cấp 2 cho người dùng cuối được thực hiện bởi cơ quan có thẩm quyền đối với CCTLD. Tôi nghĩ rằng một số thậm chí có một số tên miền cấp thứ hai dành riêng, và bán tên miền cấp thứ ba trên các tên miền cấp thứ hai và ở nơi khác. Tất nhiên, bạn cũng cần phải * duy trì * danh sách, bởi vì những điều này thay đổi (và đó là trước khi bạn tài khoản cho CCTLD mới được tạo ra) – Quentin

+0

Cảm ơn bạn! Bất kỳ ý tưởng nơi tôi có thể lấy một danh sách? Cảm thấy như nhiệm vụ không thể: S – RadiantHex

5

Sau @ đề nghị kohlehydrat của:

import urllib2 

class TldMatcher(object): 
    # use class vars for lazy loading 
    MASTERURL = "http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1" 
    TLDS = None 

    @classmethod 
    def loadTlds(cls, url=None): 
     url = url or cls.MASTERURL 

     # grab master list 
     lines = urllib2.urlopen(url).readlines() 

     # strip comments and blank lines 
     lines = [ln for ln in (ln.strip() for ln in lines) if len(ln) and ln[:2]!='//'] 

     cls.TLDS = set(lines) 

    def __init__(self): 
     if TldMatcher.TLDS is None: 
      TldMatcher.loadTlds() 

    def getTld(self, url): 
     best_match = None 
     chunks = url.split('.') 

     for start in range(len(chunks)-1, -1, -1): 
      test = '.'.join(chunks[start:]) 
      startest = '.'.join(['*']+chunks[start+1:]) 

      if test in TldMatcher.TLDS or startest in TldMatcher.TLDS: 
       best_match = test 

     return best_match 

    def get2ld(self, url): 
     urls = url.split('.') 
     tlds = self.getTld(url).split('.') 
     return urls[-1 - len(tlds)] 


def test_TldMatcher(): 
    matcher = TldMatcher() 

    test_urls = [ 
     'site.co.uk', 
     'site.com', 
     'site.me.uk', 
     'site.jpn.com', 
     'site.org.uk', 
     'site.it' 
    ] 

    errors = 0 
    for u in test_urls: 
     res = matcher.get2ld(u) 
     if res != 'site': 
      print "Error: found '{0}', should be 'site'".format(res) 
      errors += 1 

    if errors==0: 
     print "Passed!" 
    return (errors==0) 
1

@Hugh Bothwell

Trong ví dụ của bạn, bạn không phải đối phó với các lĩnh vực đặc biệt như parliament.uk, họ là đại diện trong tệp với "!" (ví dụ: quốc hội.uk)

Tôi đã thực hiện một số thay đổi mã của bạn, cũng làm cho nó trông giống như hàm PHP của tôi mà tôi đã sử dụng trước đây.

Cũng thêm khả năng tải dữ liệu từ tệp cục bộ.

Ngoài ra thử nghiệm nó với một số lĩnh vực như:

  • niki.bg, niki.1.bg
  • parliament.uk
  • niki.at, niki.co.at
  • niki. chúng tôi, niki.ny.us
  • niki.museum, niki.national.museum
  • www.niki.uk - do "*" trong tệp của Mozilla, điều này được báo cáo là OK.

Hãy liên hệ với tôi @ github để tôi có thể thêm bạn làm đồng tác giả ở đó.

GitHub repo là ở đây:

https://github.com/nmmmnu/TLDExtractor/blob/master/TLDExtractor.py

Các vấn đề liên quan