Python网络爬虫从入门到精通
上QQ阅读APP看书,第一时间看更新

3.5 解析链接

urllib模块中提供了parse子模块,主要用于解析URL,可以实现URL的拆分或者是组合。它支持如下协议的URL处理:file、ftp、gopher、hdl、http、https、imap、mailto、mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、shttp、sip、sips、snews、svn、svn+ssh、telnet、wais、ws、wss。

3.5.1 拆分URL

1.urlparse()方法

parse子模块中提供了urlparse()方法,用于实现将URL分解成不同部分,其语法格式如下:

     urllib.parse.urlparse(urlstring,scheme =' ',allow_fragments = True)

参数说明如下。

 urlstring:需要拆分的URL,该参数为必填参数。

 scheme:可选参数,表示需要设置的默认协议。如果需要拆分的URL中没有协议(如https、http等),可以通过该参数设置一个默认的协议,该参数的默认值为空字符串。

 allow_fragments:可选参数,如果该参数设置为False,则表示忽略fragment这部分内容,默认值为True。

【例3.13】 使用urlparse()方法拆分URL。(实例位置:资源包\Code\03\13)

使用urlparse()方法拆分URL的示例代码如下:

程序运行结果如下:

说明

从以上的运行结果中可以看出,调用urlparse()方法将返回一个ParseResult对象,其中由6部分组成,scheme表示协议,netloc表示域名,path表示访问的路径,params表示参数,query表示查询条件,fragment表示片段标识符。

除了直接获取返回的ParseResult对象以外,还可以直接获取ParseResult对象中的每个属性值。关键代码如下:

2.urlsplit()方法

【例3.14】 使用urlsplit()方法拆分URL。(实例位置:资源包\Code\03\14)

urlsplit()方法与urlparse()方法类似,都可以实现URL的拆分,只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回的结果只有5部分内容,并且返回的数据类型为SplitResult。示例代码如下:

程序运行结果如下:

从以上的运行结果中可以看出,使用urlsplit()方法所拆分后的URL将以SplitResult类型返回,该类型的数据既可以使用属性获取对应的值,也可以使用索引进行值的获取。示例代码如下:

3.5.2 组合URL

1.urlunparse()方法

parse子模块提供了拆分URL的方法,同样也提供了一个urlunparse()方法实现URL的组合。其语法格式如下:

     urllib.parse.urlunparse(parts)

参数说明如下。

 parts:表示用于组合url的可迭代对象。

【例3.15】 使用urlunparse()方法组合URL。(实例位置:资源包\Code\03\15)

使用urlunparse()方法组合URL的示例代码如下:

程序运行结果如下:

注意

使用urlunparse()方法组合URL时,需要注意可迭代参数中的元素必须是6个,如果参数中元素不足6个,那么将出现如图3.17所示的错误信息。

图3.17 参数元素不足的错误提示

2.urlunsplit()方法

【例3.16】 使用urlunsplit()方法组合URL。(实例位置:资源包\Code\03\16)

urlunsplit()方法与urlunparse()方法类似,同样是用于实现URL的组合,其参数也同样是一个可迭代对象,不过参数中的元素必须是5个。示例代码如下:

程序运行结果如下:

3.5.3 连接URL

urlunparse()方法与urlunsplit()方法可以实现URL的组合,而parse子模块还提供了一个urljoin()方法来实现URL的连接。其语法格式如下:

     urllib.parse.urljoin(base,url,allow_fragments = True)

参数说明如下。

 base:表示基础链接。

 url:表示新的链接。

 allow_fragments:可选参数,如果该参数设置为False,那么表示忽略fragment这部分内容,默认值为True。

【例3.17】 使用urljoin()方法连接URL。(实例位置:资源包\Code\03\17)

urljoin()方法在实现URL连接时,base参数只可以设置scheme、netloc以及path这3部分内容,如果第二个参数(url)是一个不完整的URL,那么第二个参数的值会添加至第一个参数(base)的后面,并自动添加斜杠(/)。如果第二个参数(url)是一个完整的URL,那么将直接返回第二个参数所对应的值。示例代码如下:

程序运行结果如下:

     https://docs.python.org/3/library/urllib.parse.html
     https://docs.python.org/3/library/urllib.parse.html#url-parsing

3.5.4 URL的编码与解码

URL编码是GET请求中比较常见的,是将请求地址中的参数进行编码,尤其是对于中文参数。parse子模提供了urlencode()方法与quote()方法用于实现URL的编码,而unquote()方法可以实现对加密后的URL进行解码操作。

1.urlencode()方法

【例3.18】 使用urlencode()方法编码请求参数。(实例位置:资源包\Code\03\18)

urlencode()方法接收一个字典类型的值,所以要想将URL进行编码需要先将请求参数定义为字典类型,然后再调用urlencode()方法进行请求参数的编码。示例代码如下:

程序运行结果如下:

     编码后的请求地址为:http://httpbin.org/get?name=Jack&country=%E4%B8%AD%E5%9B%BD&age=30

说明

地址中“%E4%B8%AD%E5%9B%BD&”内容为中文(中国)转码后的效果。

2.quote()方法

【例3.19】 使用quote()方法编码字符串参数。(实例位置:资源包\Code\03\19)

quote()方法与urlencode()方法所实现的功能类似,但是urlencode()方法中只接收字典类型的参数,而quote()方法则可以将一个字符串进行编码。示例代码如下:

程序运行结果如下:

     编码后的请求地址为:http://httpbin.org/get?country=%E4%B8%AD%E5%9B%BD
3.unquote()方法

【例3.20】 使用unquote()方法解码请求参数。(实例位置:资源包\Code\03\20)

unquote()方法可以将编码后的URL字符串逆向解码,无论是通过urlencode()方法,还是quote()方法所编码的URL字符串都可以使用unquote()方法进行解码。示例代码如下:

程序运行结果如下:

3.5.5 URL参数的转换

【例3.21】 使用parse_qs()方法将参数转换为字典类型。(实例位置:资源包\Code\03\21)

请求地址的URL是一个字符串,如果需要获取URL中的某个参数时,可以将URL中的参数部分获取并使用parse_qs()方法将参数转换为字典类型的数据。示例代码如下:

程序运行结果如下:

     数据类型为:<class 'dict'>
     转换后的数据:{'name': ['Jack'], 'country': ['中国'], 'age': ['30']}

【例3.22】 使用parse_qsl()方法将参数转换为元组所组成的列表。(实例位置:资源包\Code\03\22)

除了parse_qs()方法以外还有parse_qsl()方法也可以将url参数进行转换,不过parse_qsl()方法会将字符串参数转换为元组所组成的列表。示例代码如下:

程序运行结果如下:

     数据类型为:<class 'list'>
     转换后的数据:[('name', 'Jack'), ('country', '中国'), ('age', '30')]