下班了,学一点Python爬虫吧 第8天基本库urllib使用(解析链接2)

251 阅读2分钟

这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

大年初一,大家可能都去拜年了,我祝大家春节快乐,虎年虎虎生威

昨天学习了怎样解析URL和拼成URL 今天去学习一下其他的拼网址的方法 详细代码ref:code

urljoin

urlparse和urlunsplit都可以完成链接的合并,不过前提都是要有特定长度的对象, 链接的每一部分都要清晰的分开. 除了着两种方法,我们还有其他的方法来生成链接.我们可以提供一个基础链接来进行拼接(basic_url) 作为方法的第一个参数,新的链接作为第二个参数,上例子:

from urllib.parse import urljoin

print(urljoin("https://www.baidu.com","FAQ.html"))
print(urljoin("https://www.baidu.com","https://cuiqingcai/FAQ.html"))
print(urljoin("https://www.baidu.com/about.html","https://cuiqingcai/FAQ.html"))
print(urljoin("https://www.baidu.com/about.html","https://cuiqingcai/FAQ.html?question=2"))
print(urljoin("https://www.baidu.com?wd=abc","https://cuiqingcai/FAQ.html/index.php"))
print(urljoin("https://www.baidu.com","?category=2#comment"))
print(urljoin("www.baidu.com","?category=2#comment"))
print(urljoin("https://www.baidu.com#comment","?category=2"))

得到运行的结果是:

https://www.baidu.com/FAQ.html
https://cuiqingcai/FAQ.html
https://cuiqingcai/FAQ.html
https://cuiqingcai/FAQ.html?question=2
https://cuiqingcai/FAQ.html/index.php
https://www.baidu.com?category=2#comment
www.baidu.com?category=2#comment
https://www.baidu.com?category=2

说实话真的是要找规律,仔细看了.我们要知道前提,第一个是基础链接,后一个才是目标链接

urljoin 会分析基础链接的scheme netloc和path这三个内容,并对新链接的缺失部分进行补充,最后返回结果,

如果新链接不存在这三项就予以补充,如果存在就使用新的连接里面的,基础链接是不起作用的

通过,urljoin的方法我们可以轻松地实现链接的解析 拼 和生成

urlencode

书上还介绍了一个常用方法,urlencode 它在构造GET请求参数的时候非常有用,举例说明

from urllib.parse import urlencode

params = {
    'name':'flynt',
    'age': "24"
}
base_url = "https://www.baidu.com"

url = base_url+urlencode(params)
print(url)

得到的结果:https://www.baidu.comname=flynt&age=24 很明显了,根本都不要解释说明这个代码的意思

parse_qs

反序列化,直接上例子吧:

from urllib.parse import parse_qs

from urllib.parse import urlencode

params = {
    'name':'flynt',
    'age': "24"
}
base_url = "https://www.baidu.com"

url = base_url+urlencode(params)
print(url)

print(parse_qs(url))

因为上一步书序列化,所以我直接偷懒了,直接让他反序列化, 得到的结果是:

image.png

parse_qsl

parse_qsl方法将参数转化为元组,看代码:


//这代码只多加了这一行
print(parse_qsl(url))

得到的结果略有不同:

https://www.baidu.comname=flynt&age=24
{'https://www.baidu.comname': ['flynt'], 'age': ['24']}
[('https://www.baidu.comname', 'flynt'), ('age', '24')]

很有趣,快学完基础知识了,再过几天就能学点厉害的了

一切顺利,加油