我的计划是改变一个URL,删除一些路径。例如,从这个:site = "link.com/path1/path2/path3/random"
我想得到这个。"link.com/path1/path3/random"
只有当 path2
存在。path2
可能会有稍微不同的名称(如 path2_version1
, path2_version2
等)。)
我的解决方案如下。实际上,我是,分别获取所有的路径,然后合并它们。
import re
from urllib.parse import urljoin
import urllib.request
import os
import csv
site = "https://img.mysite.com/c_fill,g_auto,w_750,h_536/q_auto,f_auto/mysitecom/2020/05/06/w331e4787162_5/my-image-saved"
def image_graber(old_url):
url_main = 'https://img.mysite.com/mysitecom/'
split_url_paths = old_url.rsplit('/', 6)
url_subfolder1 = split_url_paths[2]
url_subfolder2 = split_url_paths[3]
url_subfolder3 = split_url_paths[4]
url_subfolder4 = split_url_paths[5]
url_subfolder5 = split_url_paths[6]
final_url = url_main + '/' + url_subfolder1 + '/' + url_subfolder2 + '/' + url_subfolder3 + '/' + url_subfolder4 + '/' + url_subfolder5
urllib.request.urlretrieve(final_url, "C:\My Site\IMG\/"+os.path.basename(final_url))
image_graber(site)
我试着改了一下脚本,让它更专业。在这种情况下,一个 urljoin
不能工作,因为它最多可以使用3条路径。所以,我使用了多个路径,但令我惊讶的是,它并没有工作,因为它应该。
#This didn't work
url_join1 = urljoin(url_main, url_subfolder1, url_subfolder2)
print(url_join1)
url_join2 = urljoin(url_join1, url_subfolder3, url_subfolder4)
print(url_join2)
final_join = urljoin(url_join2, url_subfolder5)
print(final_join)
我的问题是,为什么上面的方法不能用?一个可能更简单和更快的方法是使用regex来提取这部分内容,也进行了测试。
if('c_fill' or 'q_auto' in site):
exclude_path1 = re.sub(r'/c_fill[^/]+/',r'/',site)
exclude_path2 = re.sub(r'/q_auto[^/]+/',r'/',exclude_path1)
print(exclude_path2)
示例旧的url。
old_url = 'https://img.mysite.com/c_fill,g_auto,w_750,h_536/alsothis/q_auto,f_auto/mysitecom/2020/05/06/deletethis/w331e4787162_5/my-image-saved'
现在你可以简单地用''来分割它,然后做一个列表。
splitted = old_url.split('/')
另外,创建不需要的或要删除的东西
delete = ['alsothis','w331e4787162_5', 'deletethis']
现在你可以做一个快速的列表理解,以得到你的最终url。
res = '/'.join([x for x in splitted if x not in delete])
res会给你所需的输出。