2016-09-27 4 views
5

У меня есть список адресов (unicode), и есть много повторений. Например, URL-адреса http://www.myurlnumber1.com и http://www.myurlnumber1.com/foo+%bar%baz%qux ведут к тому же месту.Проверка наличия элемента в подстроке

Так что мне нужно отсеять все эти дубликаты.

Моя первая мысль была, чтобы проверить, если подстрока элемента в списке, например, так:

for url in list: 
    if url[:30] not in list: 
     print(url) 

Однако он пытается Маха буквального url[:30] к элементу списка и, очевидно, возвращает все из них, так как не является элементом, который точно соответствует url[:30].

Есть ли простой способ решить эту проблему?

EDIT:

Часто хозяин и путь в URL-адресов остается неизменным, но параметры различны. Для моих целей URL с тем же именем и хостом, но разными параметрами по-прежнему является одним и тем же URL-адресом и составляет дубликат.

+0

У вас есть такая же длина URL-адресов? – FallAndLearn

+1

Не могли бы вы уточнить критерии фильтрации? Например. какой результат вы ожидаете по следующим URL-адресам: «http://foo.com/bar», «http://foo.com/bar/boo» и «http://foo.com/baz»? –

ответ

6

Если вы считаете, какой-либо netloc, чтобы быть таким же, вы можете разобрать с urllib.parse

from urllib.parse import urlparse # python2 from urlparse import urlparse 

u = "http://www.myurlnumber1.com/foo+%bar%baz%qux" 

print(urlparse(u).netloc) 

Который даст вам:

www.myurlnumber1.com 

Так, чтобы получить уникальные netlocs вы могли бы сделать что-то вроде:

unique = {urlparse(u).netloc for u in urls} 

Если вы хотите сохранить схему URL:

urls = ["http://www.myurlnumber1.com/foo+%bar%baz%qux", "http://www.myurlnumber1.com"] 

unique = {"{}://{}".format(u.scheme, u.netloc) for u in map(urlparse, urls)} 
print(unique) 

Предполагая, что у всех есть схемы, и у вас нет http и https для одного и того же netloc и считайте их одинаковыми.

Если вы хотите добавить путь:

unique = {u.netloc, u.path) for u in map(urlparse, urls)} 

В таблице атрибутов указана в документации:

Attribute Index Value Value if not present 
scheme 0 URL scheme specifier scheme parameter 
netloc 1 Network location part empty string 
path 2 Hierarchical path empty string 
params 3 Parameters for last path element empty string 
query 4 Query component empty string 
fragment 5 Fragment identifier empty string 
username  User name None 
password  Password None 
hostname  Host name (lower case) None 
port  Port number as integer, if present None 

Вам просто нужно использовать все, что вы считаете уникальными деталями ,

In [1]: from urllib.parse import urlparse 

In [2]: urls = ["http://www.url.com/foo-bar", "http://www.url.com/foo-bar?t=baz", "www.url.com/baz-qux", "www.url.com/foo-bar?t=baz"] 


In [3]: unique = {"".join((u.netloc, u.path)) for u in map(urlparse, urls)} 

In [4]: 

In [4]: print(unique) 
{'www.url.com/baz-qux', 'www.url.com/foo-bar'} 
+0

Или сделайте это понимание, если ему действительно нужны полные URL-адреса. – Daerdemandt

+0

Спасибо, но это не работает для меня, так как иногда имя хоста одно и то же для нескольких URL-адресов, это всегда путь, который отличается. Я отредактировал вопрос, чтобы отразить это. – Zlo

+0

@ Zlo, я не совсем понимаю, что вы имеете в виду, что вы думаете об этом? Это работает на вашем входе, поэтому вам нужно добавить более подробную информацию. –

0

Вы можете попробовать добавить еще один цикл, если с ним все в порядке. Что-то вроде:

for url in list: 
    for i in range(len(list)): 
     if url[:30] not in list[i]: 
      print(url) 

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

+0

Обработка URL-адресов, как будто это просто строки, часто не очень хорошая идея. Например, будем ли мы для этой задачи видеть «http: // google.com» и «https: // google.com' как разные или одинаковые? – Daerdemandt

+0

@Daerdemandt у вас есть хороший момент. Я был уверен, что есть более надежное решение, я просто выбросил первое дело с головы. – Himself12794

Смежные вопросы