href中的相对地址如何补全

最近在写爬虫的时候发现,有很多网页中的翻页以及列表的中的选择项的超链接都是采用的相对地址。那么你要抓取对应的网页,则必须先将其补全为绝对地址,再进行request,才能抓取到对应的内容。

那么如何进行补全呢?我简单地讲述一下我所遇到的几种情况,以及在Python中的具体解决方式。

  1. 以 ‘/’ 开头
    表示***根地址+相对地址***
  2. 以 ‘./’ 开头
    表示***当前目录的地址+相对地址***
  3. 以 ‘…/’ 开头
    表示***上一级目录的地址+相对地址***
  4. 除上述三种情况外,不以任何符号作为开头
    与第二种情况一致,表示***当前目录的地址+相对地址***

下面以具体的例子分别讲述如何用python代码补全相对地址:

current_url表示当前页面的网址
relative_url表示我们获取到的相对地址
complete_url表示补全后的地址

第一种情况:以 ‘/’ 开头
理论:根地址+相对地址
分析:根地址就是‘/’和下一个 ‘/’ 中间的一段,运用字符串的切片方法,按照斜杠进行切片,最后再进行组装即可。

>>> current_url = "http://www.zhitongcaijing.com/"
>>> relative_url = "/content/detail/67357.html"
>>> complete_url = current_url.split('/')[0]+ '//' + current_url.split('/')[2] + relative_url
>>> complete_url
'http://www.zhitongcaijing.com/content/detail/67357.html'

第二种情况:以 ‘./’ 开头
理论:当前目录的地址+相对地址
分析:当前目录的地址,如图1所示。斜杠就表示分级,就和本地文件夹一致,用斜杠来表示层次结构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHlzMWZQ-1631583263929)(http://upload-images.jianshu.io/upload_images/9676068-a6b6b00838ed2328?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

>>>current_url = "http://www.zhitongcaijing.com/content/detail/67357.html"
>>> relative_url = "./67331.html"
>>> complete_url = current_url.replace(current_url.split('/')[-1], relative_url [2:]) # 将最后一个斜杠后面的字符串(注意保留最后一个斜杠)用相对地址替换掉,注意将相对地址中的'./'抹掉
>>> complete_url
'http://www.zhitongcaijing.com/content/detail/67331.html'

第三种情况:以 ‘../’ 开头
理论:上一级目录的地址+相对地址
分析:首先要判断相对地址中有多少个 ‘../’ ,才能进一步确定要向上返回多少级。如图2所示,中证网的网页结构。那么如何判断一个字符串中有多少个给定子字符串呢,作者采用正则表达式的方式进行判断的,详见代码如下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mKtzcFy4-1631583263931)(http://upload-images.jianshu.io/upload_images/9676068-bcf39a4978cdb247?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

>>> import re # 引入正则表达式的库
>>> dire_Regex = re.compile(r'\.\./') # 创建正则表达式对象
>>>current_url = "http://www.cs.com.cn/ssgs/ssb/201707/t20170707_5363166.html"
>>> relative_url = "../../gppd/sjjj/201707/t20170708_5363690.html"
>>> length = len(dire_Regex.findall(each_url)) # 确定'../'的个数
>>> complete_url = current_url.replace("".join(current_url.split('/')[-length - 1:]), relative_url[length * 3:])
>>> complete_url
'http://www.cs.com.cn/gppd/sjjj/201707/t20170708_5363690.html'

第四种情况:
与第二种情况一致,不再赘述。


最后介绍一种简单的办法,笔者在历经多重磨难之后,终于发现,原来Python有一个库自带了补全相对地址的办法 (/(ㄒoㄒ)/~~)

>>> from urllib.parse import urljoin
>>> current_url = "http://www.zhitongcaijing.com/"
>>> relative_url = "/content/detail/67357.html"
>>> complete_url = urljoin(current_url, relative_url)
>>>  complete_url
'http://www.zhitongcaijing.com/content/detail/67357.html'

如果给定的是空链接,则补全的结果仍然是原链接;

>>> from urllib.parse import urljoin
>>> url1 = "http://blog.csdn.net/hbr2014/article/details/46514277"
>>> url2 = ""
>>> complete_url = urljoin(url1, url2)
'http://blog.csdn.net/hbr2014/article/details/46514277'

如果给定的是完整的链接,则补全的结果是新的链接。

>>> from urllib.parse import urljoin
>>> url1 = "http://blog.csdn.net/hbr2014/article/details/46514277"
>>> url2 = "http://blog.csdn.net/firewall5788"
>>> complete_url = urljoin(url1, url2)
'http://blog.csdn.net/firewall5788'

你可能感兴趣的:(python,爬虫,python)