Канонический URL сравнивать в Python? - PullRequest
8 голосов
/ 20 июля 2010

Существуют ли какие-либо инструменты для сравнения URL-адресов в Python?

Например, если у меня есть http://google.com и google.com/, я бы хотел знать, что они могут быть одним и тем же сайтом.

Если бы я должен был создать правило вручную, я мог бы прописать его в верхнем регистре, затем убрать часть http:// и удалить что-нибудь после последнего буквенно-цифрового символа. Но я вижу ошибки этого, так как я уверен, что вы тоже можете.

Есть ли библиотека, которая делает это? Как бы вы это сделали?

Ответы [ 3 ]

3 голосов
/ 20 июля 2010

Это от моей головы:

def canonical_url(u):
    u = u.lower()
    if u.startswith("http://"):
        u = u[7:]
    if u.startswith("www."):
        u = u[4:]
    if u.endswith("/"):
        u = u[:-1]
    return u

def same_urls(u1, u2):
    return canonical_url(u1) == canonical_url(u2)

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

2 голосов
/ 20 июля 2010

Вы можете посмотреть имена с помощью dns и посмотреть, указывают ли они на один и тот же ip.Для удаления запутанных символов может потребоваться небольшая обработка строк.

from socket import gethostbyname_ex

urls = ['http://google.com','google.com/','www.google.com/','news.google.com']

data = []
for orginalName in urls:
    print 'url:',orginalName
    name = orginalName.strip()
    name = name.replace( 'http://','')
    name = name.replace( 'http:','')
    if name.find('/') > 0:
        name = name[:name.find('/')]
    if name.find('\\') > 0:
        name = name[:name.find('\\')]
    print 'dns lookup:', name
    if name:
        try:
            result = gethostbyname_ex(name)
        except:
            continue # Unable to resolve
        for ip in result[2]:
            print 'ip:', ip
            data.append( (ip, orginalName) )

print data

результат:

url: http://google.com
dns lookup: google.com
ip: 66.102.11.104
url: google.com/
dns lookup: google.com
ip: 66.102.11.104
url: www.google.com/
dns lookup: www.google.com
ip: 66.102.11.104
url: news.google.com
dns lookup: news.google.com
ip: 66.102.11.104
[('66.102.11.104', 'http://google.com'), ('66.102.11.104', 'google.com/'), ('66.102.11.104', 'www.google.com/'), ('66.102.11.104', 'news.google.com')]
0 голосов
/ 20 июля 2010

Это не «нечетко», просто найти «расстояние» между двумя строками:

http://pypi.python.org/pypi/python-Levenshtein/

Я бы удалил все части, которые семантически значимы для парсинга URL (протокол, косые черты и т. Д.), Нормализовал бы их в нижний регистр, затем выполнил расстояние Левенштейна, а затем решил, какая разница является приемлемым порогом.

Просто идея.

...