Urllib库之解析链接
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。
urlparse()
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result)
urlparse的函数格式为:urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
输出的结果为:
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
返回的结果将我们提供的链接http://www.baidu.com/index.html;user?id=5#comment拆分成了6部分:scheme、netloc、path、params、query、fragment。所以我们可以得知一般的标准的链接格式:scheme://netloc/path;parameters?query#fragment
urlunparse()
接收的参数必须是一般url能拆分的6部分(长度必须为6,否则会抛出参数数量不足的问题)。这个函数的意思就是将拆分的6部分结合在一起成为一个完整的url。
urlsplit()
和 urlparse() 方法非常相似,只不过它不会单独解析 parameters 这一部分,只返回五个结果,即 parameters 会合并到 path中。
urlunsplit()
与 urlunparse() 类似,也是将链接的各个部分组合成完整链接的方法,传入的也是一个可迭代对象,例如列表、元组等等,唯一的区别是,长度必须为 5。
urljoin()
uelunparse()与urlunsplit()方法都是限定了参数的链接合并,但其实我们可以利用urljoin(),这也是爬虫中最常用的方式。首先定义一个base_url,再定义一个新的参数作为完整链接的剩余部分。base_url 提供了三项内容,scheme、netloc、path,如果这三项在新的链接里面不存在,那么就予以补充,如果新的链接存在,那么就使用新的链接的部分。base_url 中的 parameters、query、fragments 是不起作用的。举个例子base_url=‘https://www.baidu.com’,如果新的参数为'?q=hh',那么urljoin()之后就是‘https://www.baidu.com?q=hh’。如果新的参数为一个链接形式'www.baidu.com?category=2#comment',那么最后形成的连接形式就为新的链接而忽略了base_url。
urlencode()
个常用的 urlencode() 方法,它在构造 GET 请求参数的时候非常有用。
from urllib.parse import urlencode
params = {
'name': 'germey',
'age': 22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)
首先声明了一个字典,将参数表示出来,然后调用 urlencode() 方法将其序列化为 URL 标准 GET 请求参数。
得到的结果为:
http://www.baidu.com?name=germey&age=22
parse_qs()
有了序列化必然就有反序列化,如果我们有一串 GET 请求参数,我们利用 parse_qs() 方法就可以将它转回字典
parse_qsl()
与parse_qs()的功能是类似的,只不过是将参数转化为元组组成的列表。
quote()
quote() 方法可以将内容转化为 URL 编码的格式,有时候 URL 中带有中文参数的时候可能导致乱码的问题,所以我们可以用这个方法将中文字符转化为 URL 编码:。注意观察网址的时候会发现,有些网站之后会有很长一串的字母符号数字混合组成的字符串,这有可能是加密后的编码,也有可能是URL编码的转换,举个例子:
from urllib.parse import quote
keyword = '壁纸'
url = 'https://www.baidu.com/s?wd=' + quote(keyword)
print(url)
得出的结果为:
https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8
unquote()
可以进行URL解码。