在Python中的规范URL比较?
有什么工具可以在Python中进行URL比较吗?
例如,如果我有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/
我将删除所有对URL解析(协议,斜线等)语义有意义的部分,归一化为小写,然后执行levenstein距离,然后从那里确定有多少差异是可接受的阈值。
只是一个想法。
链接地址: http://www.djcxy.com/p/2071.html