上一节,我们讲了如何通过urllib中的request模块发起网络请求并读取响应。在发起网络请求时,传输正确的url参数是非常重要的。为此,urllib专门提供了一个parse模块用于帮助我们处理URL,它可以帮助我们实现针对URL的提取、解析和合并等。下面我们就针对其中的重点方法做详细说明。
一、urlparse()方法
该方法用于将URL解析为多个分段,其API如下:
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
urlstring:这是必填项,是我们需要解析的URL。scheme:它是默认的协议,即当URL中未携带协议信息时,会以此值作为默认的协议。allow_fragments:是否允许fragment,默认允许。URL可以标识主要资源,而fragment用于标识次级资源。一般来说在URL末尾通过#标识的部分就是fragment,如#usercenter可能标识了用户中心的位置。当我们设置其为False时,#及后边的部分会被解析到其他信息中。
我们来看一个简单的例子。
from urllib.parse import urlparse
url = 'https://www.oldq.top/index.php?page_id=20#usertab1'
res = urlparse(url)
print(type(res))
print(res)
输出为:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.oldq.top', path='/index.php', params='', query='page_id=20', fragment='usertab1')
可以看到,这里的输出包含了六个部分:
scheme:协议,它是指//之前的部分,最常见的就是http、https、ftp等。netloc:域名,这个很好理解,像上文中www.oldq.top就是老Q斥巨资购买的个人域名。path:我们要访问的网页或文件相对于根目录的相对路径,是指域名后边的那一部分。params:访问参数。query:查询条件,是指问号后边的那一部分。fragment:锚点,一般用于定位页面内的次级资源,比如网页中的用户中心模块或者评论模块等,正如前文所述,它一般跟在#后边。
urlparse返回的结果实际上继承了命名元组(NamedTuple),所以我们可以通过索引或者属性名称来提取信息,如res[0]、res['scheme']。
二、urlunparse()方法
与urlparse相对应,urlunparse()用于将URL的不同部分组合成为一个完整的URL。简单示例如下:
from urllib.parse import urlunparse
parts = ['https', 'www.oldq.top', 'index.php', '', 'page_id=20', 'usertab1']
print(urlunparse(parts))
输出为:
https://www.oldq.top/index.php?page_id=20#usertab1
三、urlsplit()方法
urlsplit()与urlparse()很像,区别只在于它不再单独解析params,而是将其与path合并。仍以刚才的例子来看:
from urllib.parse import urlsplit
url = 'https://www.oldq.top/index.php?page_id=20#usertab1'
res = urlsplit(url)
print(type(res))
print(res)
输出为:
<class 'urllib.parse.SplitResult'>
SplitResult(scheme='https', netloc='www.oldq.top', path='/index.php', query='page_id=20', fragment='usertab1')
可以看到,结果里没有了params属性。
四、urlunsplit()方法
或许urllib库的作者有强迫症吧,也或许他只是有成人之美的善良。假设urlsplit()是男,urlunsplit就是女,男女搭配,干活不累。单身的码农们看到这些成双入对的方法,也不知道会不会流下酸涩的泪水。
这个方法没什么好说的,用法跟urlunparse()一样,只是要在传入的参数中去掉params的部分。
五、urljoin()方法
这个方法也用于通过合并生成URL。鉴于它和urlunparse()、urlunsplit()的功能并不一样,所以我们也单独列出来。我们看一下它的API:
urllib.parse.urljoin(base, url, allow_fragments=True)
base:它是一个基链接,用来给后边的url参数对应的链接补充scheme、netloc和path部分的缺失,如果url参数对应的链接在这三个部分没有缺失,那最后生成的链接在这三部分采用的是url参数中的信息。url:我们希望访问的链接(但是可能在某些部分不全)。allow_fragments:默认为True,与urlparse()中含义一样。
六、quote()方法
quote()方法用于将内容转化为URL编码的格式。我们经常可以看到在包含中文的链接里,中文往往以奇怪的字符串存在。
比如https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85实际上就是老Q最帅的百度搜索链接。我们在百度搜索老Q最帅,然后从地址栏中将链接复制出来,粘贴到文本中,就会得到上边这个乱七八糟的链接。

我们仍以“老Q最帅”为例。
from urllib.parse import quote
keyword = '老Q最帅'
url = 'https://www.baidu.com/s?wd={0}'.format(quote(keyword))
print(url)
输出为:
https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85
跟上边我们从浏览器里复制出来的链接一模一样。
七、unquote()方法
假如quote()是男的,unquote()就是女的,它们就是一对恩爱的狗男女。假设我们看到这么一条链接:https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85,我们很难想到,它的尾缀是在阐述这么一条真理:老Q最帅。
但是我们可以通过解码来找到真相。
from urllib.parse import unquote
url = 'https://www.baidu.com/s?wd=%E8%80%81Q%E6%9C%80%E5%B8%85'
print(unquote(url))
输出为:
https://www.baidu.com/s?wd=老Q最帅
跟你们想的一模一样。
八、urlencode()方法
urlencode()用来帮助我们对请求参数进行编码,它是非常重要且常用的方法。其API如下:
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
query:它是我们要编码的信息,可以是字典类型或者是一组二元的元组(元组的第一个元素为key,第二个元素为value)。- 其他参数一般我们不需要特意填写,后边实战时有需要我们再详细说明。
我们来看一个例子:
from urllib.parse import urlencode
data = {
'name': 'oldq',
'gender': 'male',
'interest': 'basketball'
}
print(urlencode(data))
data = (('name', 'oldq'), ('gender', 'male'), ('interest', 'basketball'))
print(urlencode(data))
输出为:
name=oldq&gender=male&interest=basketball
name=oldq&gender=male&interest=basketball
可以看到,urlencode()方法实质上就是把key-value对转换成链接里常见的key=value的格式并以&符号连接,也就是生成query部分的内容。编码之后,这些参数就可以跟在?符号后边,与?之前的部分共同组成一个完整的携带参数的链接。
九、parse_qs()方法
parse_qs()方法和urlencode()方法属于一阴一阳,假设urlencode()是男,parse_qs()就是女,男女搭配,干活……
parse_qs()接受拼接好的query,并解析为字典。
from urllib.parse import parse_qs
query = 'name=oldq&gender=male&interest=basketball'
print(parse_qs(query))
输出为:
{'name': ['oldq'], 'gender': ['male'], 'interest': ['basketball']}
十、parse_qsl()方法
假设urlencode()是男,parse_qs()就是女,parse_qsl()就是女小三。男女女搭配,必有一战。
parse_qsl()接受拼接好的query,并解析为元组。
from urllib.parse import parse_qsl
query = 'name=oldq&gender=male&interest=basketball'
print(parse_qsl(query))
输出为:
[('name', 'oldq'), ('gender', 'male'), ('interest', 'basketball')]
好了,上述就是parse模块中最常用的一些方法,我们距离实战越来越近啦,有没有蠢蠢欲动?
本文是Python爬虫入门教程的第二部分,详细介绍了urllib模块的使用,包括urlparse、urljoin、urldefrag、urlencode、quote和unquote等方法,讲解了如何处理和组合URL,以及对请求参数的编码和解码操作。通过实例演示,帮助读者掌握网络请求的关键步骤。
2344

被折叠的 条评论
为什么被折叠?



