参数说明:
def handleHref(response_url, href):
"""
1.(无)开头表示当前目录下的
2.(/)开头的目录表示该目录为根目录的一个子目录
3.(./)开头的目录表示该目录为当前目录(当前目录所在的目录)的一个子目录
4.(../)开头的目录表示该目录为当前目录的父目录
5.(//)开头的目录表示和当前页面使用同一种协议http/https
6.(?)开头的表示当前目录下补充?及其后面的参数
"""
if href.startswith("//"):
# 获取response_url请求协议
http = urlparse(response_url)[0]
return_href = http + ":" + href
elif href.startswith("/"):
hostname = urlparse(response_url).netloc
prefix = urlparse(response_url).scheme + "://" + hostname
return_href = prefix + href
elif href.startswith("./"):
prefix = dirname(response_url) + "/"
return_href = prefix + href.replace("./", "")
elif href.startswith("../"):
dir_name = dirname(response_url) + "/"
new_prefix_list = dir_name.split("/")[0:len(dir_name.split("/")) - href.count("../") - 1]
new_prefix = ""
for p in new_prefix_list:
new_prefix = new_prefix + p + "/"
return_href = new_prefix + href.replace("../", "")
elif href.startswith("?"):
# 有些href链接是?开头的,例如,?page=1&id=1,这就需要拿到response_url的无参数链接
url_dir = dirname(response_url)
url_base = basename(response_url).replace(" ", "")
url1 = url_base.split("?")
return_href = url_dir + "/" + url1[0] + href
else:
# 其它特殊情况,这里是自己随便定的规则,可以自定义规则
prefix = dirname(response_url) + "/"
return_href = prefix + href
return return_href