- Python网络爬虫从入门到精通
- 明日科技编著
- 1917字
- 2025-02-14 21:27:59
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的示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P54_52521.jpg?sign=1739690033-Zva9L4G8aMXptCmmzIBVpLWydjdO7o6M-0-c3820e608d6ea1ba8bf488011111e650)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P54_52522.jpg?sign=1739690033-gpdE87WZwWWUO1NEm6WVjlNDkRTaSmJA-0-a1c53289c1d21a17e6546f6744b83128)
说明
从以上的运行结果中可以看出,调用urlparse()方法将返回一个ParseResult对象,其中由6部分组成,scheme表示协议,netloc表示域名,path表示访问的路径,params表示参数,query表示查询条件,fragment表示片段标识符。
除了直接获取返回的ParseResult对象以外,还可以直接获取ParseResult对象中的每个属性值。关键代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P54_52523.jpg?sign=1739690033-ly8xiJJtOZDiP6RLbAEx05AWdixfqxVn-0-da50e18c2afea2385f48afac194424f9)
2.urlsplit()方法
【例3.14】 使用urlsplit()方法拆分URL。(实例位置:资源包\Code\03\14)
urlsplit()方法与urlparse()方法类似,都可以实现URL的拆分,只是urlsplit()方法不再单独拆分params这部分内容,而是将params合并到path中,所以返回的结果只有5部分内容,并且返回的数据类型为SplitResult。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P55_52524.jpg?sign=1739690033-tyfxkt9SGBWi151l7hYDXtpoh6TH7HRP-0-df32fae6858737347bc07cf960c80d5e)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P55_52525.jpg?sign=1739690033-uhyl1sfLn9fL6ITgUkqEZqzXS2mGCALg-0-fab9586a50a8ee538ad5ba01b53d55a7)
从以上的运行结果中可以看出,使用urlsplit()方法所拆分后的URL将以SplitResult类型返回,该类型的数据既可以使用属性获取对应的值,也可以使用索引进行值的获取。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P55_52526.jpg?sign=1739690033-S3oHBTCwHN5yuU1p6uLjtGVe0E6Rrh3g-0-e82d6b4e0319c61aab42183cf84af12e)
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的示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P55_52527.jpg?sign=1739690033-Vklx6sxAqJLpqltQEsNPeMRGejAz1A1c-0-2b292c86f2b9b5db0713795c68f26895)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P56_52529.jpg?sign=1739690033-IjKuxbQJoIPkGxZ9BQb00kmBADhaHWll-0-e0a0705e6e34fd978e8c64163bfdc0a7)
注意
使用urlunparse()方法组合URL时,需要注意可迭代参数中的元素必须是6个,如果参数中元素不足6个,那么将出现如图3.17所示的错误信息。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P56_12229.jpg?sign=1739690033-aHE0wboslt7E7z86CzcvBkPoTskO95UF-0-7eedc8a288987da2e1c24f230dff6008)
图3.17 参数元素不足的错误提示
2.urlunsplit()方法
【例3.16】 使用urlunsplit()方法组合URL。(实例位置:资源包\Code\03\16)
urlunsplit()方法与urlunparse()方法类似,同样是用于实现URL的组合,其参数也同样是一个可迭代对象,不过参数中的元素必须是5个。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P56_52530.jpg?sign=1739690033-zSBe3AGFEAh7COOQGos9pFmo3ggk2ZAu-0-a853b4ea35adac185f3c998a95c45bdc)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P56_52531.jpg?sign=1739690033-wAIspHcAwcYqHxdDoDPzGT9MRsbmIinS-0-531174c5a36f28bb635069007e5c6800)
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://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P57_52532.jpg?sign=1739690033-lnnDA8stwW9jMxCNeKSsLW0H90GsWRwo-0-006240875867c3d88db0190638819ed0)
程序运行结果如下:
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()方法进行请求参数的编码。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P57_52534.jpg?sign=1739690033-XAtrZm3RBFgQL36ClfZBkDvaqXosOlOi-0-d9628ad54343591d60fe2b54c5fa4705)
程序运行结果如下:
编码后的请求地址为: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()方法则可以将一个字符串进行编码。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P58_52535.jpg?sign=1739690033-RbLNMZry68x7I2vHiUSnApmBuHR4kSBW-0-99ae29f4ad3f85043b8c78e08e0f856f)
程序运行结果如下:
编码后的请求地址为: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()方法进行解码。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P58_52536.jpg?sign=1739690033-NJk6bMDiyDZCkkqZN79m7FjKc0R9nZJf-0-84000e44c0b085cae2ec414f89d3b03a)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P58_52537.jpg?sign=1739690033-SmwSrifEgU6ulyMF2rIb3xik3FUDJvpC-0-f793709f0fa7f355aa0becb485ed664a)
3.5.5 URL参数的转换
【例3.21】 使用parse_qs()方法将参数转换为字典类型。(实例位置:资源包\Code\03\21)
请求地址的URL是一个字符串,如果需要获取URL中的某个参数时,可以将URL中的参数部分获取并使用parse_qs()方法将参数转换为字典类型的数据。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P58_53243.jpg?sign=1739690033-mjXKqvLIVjCIhYAbJg307ozmUBX6qfuK-0-06f61c79e6db758b73661ff24957f529)
程序运行结果如下:
数据类型为:<class 'dict'> 转换后的数据:{'name': ['Jack'], 'country': ['中国'], 'age': ['30']}
【例3.22】 使用parse_qsl()方法将参数转换为元组所组成的列表。(实例位置:资源包\Code\03\22)
除了parse_qs()方法以外还有parse_qsl()方法也可以将url参数进行转换,不过parse_qsl()方法会将字符串参数转换为元组所组成的列表。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P59_52540.jpg?sign=1739690033-9VmZXwuk5KmeXTmb62ScPR7c9PtnvTyM-0-fa80e485bca80ff67e632ec33c630558)
程序运行结果如下:
数据类型为:<class 'list'> 转换后的数据:[('name', 'Jack'), ('country', '中国'), ('age', '30')]