2010-07-19 13 views
7

क्या पाइथन में यूआरएल की तुलना करने के लिए कोई उपकरण हैं?कैननिकल यूआरएल पायथन में तुलना करता है?

उदाहरण के लिए, यदि मेरे पास http://google.com और google.com/ है, तो मुझे यह जानना है कि वे एक ही साइट होने की संभावना है।

यदि मैं मैन्युअल रूप से नियम बनाना चाहता था, तो मैं इसे अपरकेस कर सकता हूं, फिर http:// भाग को बंद कर दें, और अंतिम अल्फा-न्यूमेरिक चरित्र के बाद कुछ भी छोड़ दें .. लेकिन मुझे यकीन है कि मैं इसकी विफलताओं को देख सकता हूं, क्योंकि मुझे यकीन है आप भी कर सकते हैं

क्या कोई पुस्तकालय है जो यह करता है? आपको इसे कैसे करना होगा?

+0

संभव डुप्लिकेट: http://stackoverflow.com/questions/682367/ –

+0

यह आप पोस्ट एक्स प्रतिष्ठा के बिना दो _links_ नहीं दूँगा, लेकिन आप के रूप में कई शामिल कर सकते हैं यूआरएल जैसा आप चाहते हैं अगर आप उन्हें बैकक्वॉट्स में डाल दें ताकि पार्सर उन्हें लिंक में परिवर्तित न करे। मैंने आपके प्रश्न को संपादित करने के लिए संपादित किया जो मुझे लगता है कि आप क्या सोचते हैं, लेकिन अगर मुझे यह गलत लगता है तो कृपया इसे सही करने के लिए इसे फिर से संपादित करें। –

+0

ओह, और एक और बात: "फ़ज़ी" तुलना से आपका क्या मतलब है? यह कहना आसान है कि 'http: // google.com' और 'google.com /' एक ही चीज़ हैं क्योंकि उनके पास समान कैननिकल रूप है, लेकिन यह अस्पष्ट तुलना नहीं है। एक वास्तविक अस्पष्ट तुलना उन यूआरएल की पहचान करेगी जो समान हैं, लेकिन समान नहीं हैं, भले ही आप उन्हें एक मानक रूप में परिवर्तित कर सकें। –

उत्तर

-1

यह 'अस्पष्ट' नहीं, यह सिर्फ दो तार के बीच की दूरी 'लगता है:

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

मैं सभी भागों जो शब्दार्थ पार्स करने यूआरएल को सार्थक कर रहे हैं (प्रोटोकॉल, स्लैश, आदि) हटा , लोअरकेस को सामान्य करें, फिर एक लेवेनस्टीन दूरी करें, फिर वहां से तय करें कि स्वीकार्य सीमा कितनी अंतर है।

बस एक विचार।

3
मेरे सिर के ऊपर से

यह:

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) 

जाहिर है, और भी है इस के साथ नगण्य के लिए कमरे के बहुत सारे। Regexes प्रारंभिक और endwith से बेहतर हो सकता है, लेकिन आप विचार मिलता है।

+0

यह वही है जो मैं बनाना चाहता हूं अगर मैं इसे मैन्युअल रूप से करने जा रहा था। मैं उम्मीद कर रहा था कि एक ऐसा lib था जो पहले से ही ऐसा करता है। ऐसा लगता है कि यह एक हल समस्या होनी चाहिए। –

+0

@ कोलिन: यह उन चीजों में से एक है जहां इसे स्वयं करना आम तौर पर काफी आसान होता है, और आपको जो भी चाहिए वह आपको प्राप्त करने की अधिक संभावना होती है। बात यह है कि यूआरएल का कड़ाई से परिभाषित 'कैनोलिक फॉर्म' नहीं है, इसलिए जो भी इसे चाहता है वह कुछ अलग सोच रहा है। –

+0

मैं निकोलस से सहमत हूं: यह एक मानक परिभाषा प्राप्त करने के लिए पर्याप्त रूप से परिभाषित नहीं है। आप इसे स्वयं लिखकर सबसे अच्छी सेवा करेंगे। –

1

आप डीएनएस का उपयोग कर नाम देख सकते हैं और देख सकते हैं कि वे एक ही आईपी को इंगित करते हैं या नहीं। भ्रमित वर्णों को हटाने के लिए कुछ मामूली स्ट्रिंग प्रसंस्करण की आवश्यकता हो सकती है।

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')] 
संबंधित मुद्दे