Python で URL 比較を行うツールはありますか?
たとえば、私が持っていhttp://google.com
てgoogle.com/
、それらが同じサイトである可能性が高いことを知りたい場合.
ルールを手動で作成する場合は、それを大文字にしてから、その部分を取り除き、http://
最後の英数字の後にあるものをすべて削除します..
これを行うライブラリはありますか?どのようにしますか?
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)
明らかに、これをいじる余地はたくさんあります。正規表現はstartswithとendswithよりも優れているかもしれませんが、アイデアはわかります.
どうやら、正規の URL を作成するにはかなりの手間がかかります。私がテストした中では、url-normalizeライブラリが最適です。
URL のソースによっては、 UTM コードなどの他の標準パラメータを削除したい場合があります。これにはw3lib.url.url_query_cleanerが便利です。
これをNed Batchelder の答えと組み合わせると、次のようになります。
コード:
from w3lib.url import url_query_cleaner
from url_normalize import url_normalize
urls = ['google.com',
'google.com/',
'http://google.com/',
'http://google.com',
'http://google.com?',
'http://google.com/?',
'http://google.com//',
'http://google.com?utm_source=Google']
def canonical_url(u):
u = url_normalize(u)
u = url_query_cleaner(u,parameterlist = ['utm_source','utm_medium','utm_campaign','utm_term','utm_content'],remove=True)
if u.startswith("http://"):
u = u[7:]
if u.startswith("https://"):
u = u[8:]
if u.startswith("www."):
u = u[4:]
if u.endswith("/"):
u = u[:-1]
return u
list(map(canonical_url,urls))
結果:
['google.com',
'google.com',
'google.com',
'google.com',
'google.com',
'google.com',
'google.com',
'google.com']
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')]
「あいまい」ではなく、2 つの文字列間の「距離」を見つけるだけです。
http://pypi.python.org/pypi/python-Levenshtein/
URL 解析にとって意味のある部分 (プロトコル、スラッシュなど) をすべて削除し、小文字に正規化してからレーベンシュタイン距離を実行し、そこから許容可能なしきい値となる差異の数を決定します。
ただのアイデア。