2011-02-06 16 views
6

Ho un elenco di domini, ad es.Estrai dominio di 2 ° livello dal dominio? - Python

  • site.co.uk

  • site.com

  • site.me.uk

  • site.jpn.com

  • site.org. uk

  • site.it

anche i nomi di dominio possono contenere 3 ° e 4 ° livello per esempio i domini

  • test.example.site.org.uk

  • test2.site.com

Ho bisogno di provare ed estrarre il dominio di 2 ° livello, in tutti questi casi essendo site


Qualche idea? :)

+0

quello che è il tag jQuery per? – jAndy

+0

In modo simile a: http://stackoverflow.com/questions/1066933/python-extract-domain-name-from-url –

risposta

8

nessun modo per ottenerlo in modo affidabile. I sottodomini sono arbitrari e c'è un elenco di mostri di estensioni di dominio che cresce ogni giorno. Il caso migliore è controllare l'elenco dei mostri delle estensioni di dominio e mantenere l'elenco.

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

+0

dov'è la lista dei mostri? : | – RadiantHex

+0

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

+0

grazie! Se riesci a mettere quella lista nella tua risposta sarò felice di spuntarla! :) – RadiantHex

3

Problema nel mix di estrazioni 1 ° e 2 ° livello.

soluzione Trivial ...

lista Costruire dei possibili suffissi del sito, ordinato da stretto a caso comune. "co.uk", "uk", "co.jp", "jp", "com"

E controllare, può essere suffisso alla fine del dominio. se abbinato, la prossima parte è sito.

2

L'unico modo possibile sarebbe tramite un elenco con tutti i domini di primo livello (qui come .com o co.uk) possibili. Quindi dovresti esaminare questo elenco e controllare. Non vedo nessun altro modo, almeno senza accedere a Internet in fase di runtime.

+1

È necessario l'elenco, anche con accesso a Internet in fase di esecuzione. La decisione di vendere domini di secondo livello o domini di secondo livello agli utenti finali è presa dall'autorità per il CCTLD. Penso che alcuni abbiano anche alcuni domini di secondo livello riservati e vendano domini di terzo livello su domini di primo e secondo livello altrove. Naturalmente, devi anche * mantenere * la lista, perché queste cose cambiano (e questo è prima che tu possa creare nuovi CCTLD) – Quentin

+0

Grazie! Qualche idea su dove potrei prendere una lista? Sembra impossibile la missione: S – RadiantHex

5

seguito @ suggerimento di kohlehydrat:

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

Nel tuo esempio non si ha a che fare con i domini speciali come parliament.uk, sono rappresentare il file con "!" (ad esempio! parlamento.uk)

Ho apportato alcune modifiche al codice, inoltre sembra più simile alla mia funzione PHP che ho usato prima.

Aggiunta anche la possibilità di caricare i dati dal file locale.

anche provato con alcuni domini tali:

  • niki.bg, niki.1.bg
  • parliament.uk
  • niki.at, niki.co.at
  • niki. us, niki.ny.us
  • niki.museum, niki.national.museum
  • www.niki.uk - a causa di "*" nel file di Mozilla questo è segnalato come OK.

Non esitate a contattarmi @ github così posso aggiungervi come co-autore lì.

GitHub pronti contro termine è qui:

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

Problemi correlati