Извлечь домен второго уровня из домена?- питон - PullRequest
7 голосов
/ 07 февраля 2011

У меня есть список доменов, например

  • site.co.uk

  • site.com

  • site.me.uk

  • site.jpn.com

  • site.org.uk

  • site.it

также доменные имена могут содержать домены 3-го и 4-го уровня, например

  • test.example.site.org.uk

  • test2.site.com

Мне нужно попытаться извлечь домен 2-го уровня, во всех этих случаях site


Есть идеи? :)

Ответы [ 6 ]

8 голосов
/ 07 февраля 2011

нет способа получить это достоверно.Субдомены произвольны, и существует огромный список расширений доменов, который растет с каждым днем.В лучшем случае вы проверяете список доменов и ведете этот список.

список: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

5 голосов
/ 07 февраля 2011

Следуя совету @ 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)
3 голосов
/ 18 мая 2013

Использование python tld

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

$ pip install tld

from tld import get_tld, get_fld

print(get_tld("http://www.google.co.uk"))
'co.uk'

print(get_fld("http://www.google.co.uk"))
'google.co.uk'
3 голосов
/ 07 февраля 2011

Проблема в сочетании извлечений 1-го и 2-го уровня.

Тривиальное решение ...

Построение списка возможных суффиксов сайта, упорядоченных от узкого к общему."co.uk", "uk", "co.jp", "jp", "com"

И проверьте, может ли суффикс совпадать в конце домена.если соответствует, следующая часть сайта.

2 голосов
/ 07 февраля 2011

Единственный возможный путь - через список со всеми возможными доменами верхнего уровня (здесь, например .com или co.uk).Тогда вы бы просканировали этот список и проверили.Я не вижу другого пути, по крайней мере, без доступа к Интернету во время выполнения.

1 голос
/ 15 апреля 2013

@ Хью Ботвелл

В вашем примере вы не имеете дело со специальными доменами, такими как Parliament.uk, они представлены в файле с "!"(например, Parliament.uk)

Я сделал некоторые изменения в вашем коде, а также сделал его похожим на мою функцию PHP, которую я использовал ранее.

Также добавлена ​​возможность загрузки данных из локального файла.

Также протестировал его с некоторыми доменами, такими как:

  • 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 - в срокна "*" в файле Mozilla это сообщается как ОК.

Не стесняйтесь связаться со мной @ github, чтобы я мог добавить вас в качестве соавтора.

Репозиторий GitHub здесь:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...