我有一个urls(unicode)列表,并且有很多重复.例如,网址http://www.myurlnumber1.com并http://www.myurlnumber1.com/foo+%bar%baz%qux指向同一个地方.
所以我需要清除所有这些重复项.
我的第一个想法是检查元素的子字符串是否在列表中,如下所示:
for url in list:
if url[:30] not in list:
print(url)
Run Code Online (Sandbox Code Playgroud)
但是,它尝试将字面url[:30]元素作为文字元素并显然返回所有这些元素,因为没有完全匹配的元素url[:30].
有没有简单的方法来解决这个问题?
编辑:
网址中的主机和路径通常保持不变,但参数不同.出于我的目的,具有相同主机名和路径但不同参数的URL仍然是相同的URL并构成重复.
如果你认为任何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)
Run Code Online (Sandbox Code Playgroud)
哪个会给你:
www.myurlnumber1.com
Run Code Online (Sandbox Code Playgroud)
因此,要获得独特的netlocs,您可以执行以下操作:
unique = {urlparse(u).netloc for u in urls}
Run Code Online (Sandbox Code Playgroud)
如果你想保留网址方案:
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)
Run Code Online (Sandbox Code Playgroud)
假设它们都有方案,并且您没有相同netloc的http和https,并认为它们是相同的.
如果您还想添加路径:
unique = {u.netloc, u.path) for u in map(urlparse, urls)}
Run Code Online (Sandbox Code Playgroud)
属性表列在文档中:
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
Run Code Online (Sandbox Code Playgroud)
你只需要使用你认为是独特部分的任何东西.
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'}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |