Там какие-либо инструменты должны сделать, URL выдерживает сравнение в Python?
Например, если я имею http://google.com
и google.com/
Я хотел бы знать, что они, вероятно, будут тем же сайтом.
Если бы я должен был создать правило вручную, то я мог бы Верхний регистр оно, затем снимать изоляцию http://
часть и отбрасывание что-либо после последнего буквенно-цифрового знака.. Но я вижу отказы этого, поскольку я уверен, что Вы можете также.
Существует ли библиотека, которая делает это? Как Вы сделали бы это?
Это пришло мне в голову:
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)
Очевидно, есть еще много места, чтобы возиться с этим. Регулярные выражения могут быть лучше, чем начинаться с и заканчиваться, но идею вы поняли.
Вы можете найти имена с помощью 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')]
Он не «нечеткий», он просто определяет «расстояние» между двумя строками:
http://pypi.python.org/pypi/python-Levenshtein/
I удалит все части, которые семантически значимы для синтаксического анализа URL (протокол, косые черты и т. д.), нормализует до нижнего регистра, затем выполнит расстояние Левенштейна, а затем оттуда решит, сколько различий является приемлемым порогом.
Просто идея.