3. Urllib -- urllib.parse
2018-06-14 本文已影响79人
江湖十年
- 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
urlparse()
- urlparse() 方法可以实现 URL 的识别和分段
"""
urlparse() 可以实现 url 的识别和分段
会将传入的 url 分成 6 个部分
"""
import urllib.parse
url = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlparse(url)
print(type(result)) # <class 'urllib.parse.ParseResult'>
print(result) # ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
print(result.scheme) # 协议 http
print(result.netloc) # 域名/IP地址:端口号 www.baidu.com
print(result.path) # 访问资源的路径 /index.html
print(result.params) # 参数, 发送给服务器的请求数据 user
print(result.query) # 查询参数, 发送给服务器的请求数据 kw=Python&id=123
print(result.fragment) # 锚点 urlparse
# 标准 url 链接组成格式:(PS:最新的http协议中已移除分号传参)
# scheme://netloc/path;parameters?query#fragment
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
http
www.baidu.com
/index.html
user
kw=Python&id=123
urlparse
- urlparse() 方法参数的使用
urllib.parse.urlparse(url, scheme='', allow_fragments=True)
观察源码发现 urlparse() 方法有 3 个参数需要传递
- url: 需要解析的 url, 为必须参数
- scheme: 可以指定默认的协议, 如果 url 中没有协议类型, 则解析结果中会将这个参数作为默认协议类型, 如果 url 中带有协议类型, 则此参数无效, 可选参数
- allow_fragments: 判定解析 url 时是否忽略锚点, 默认为 True, 设为 False 则会自动忽略锚点, 忽略后的锚点部分参数会被解析为 path、params、query 三者之一中的一部分, 可选参数
-
scheme 参数实例
url 中带有协议类型, 可以发现 scheme 参数并没有起作用
import urllib.parse
url = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlparse(url=url, scheme='https')
print(result)
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
url 中没有协议类型, 可以发现解析结果中 scheme 为指定的 https
import urllib.parse
url = 'www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlparse(url=url, scheme='https')
print(result)
ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='kw=Python&id=123', fragment='urlparse')
- allow_fragments 参数实例
import urllib.parse
url1 = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
url2 = 'http://www.baidu.com/index.html;user#urlparse'
url3 = 'http://www.baidu.com/index.html#urlparse'
url4 = 'http://www.baidu.com/#urlparse'
# allow_fragments 参数判定解析 url 时是否忽略锚点, 默认为 True,
# 设为 False 则会自动忽略锚点, 忽略后的锚点部分参数
# 会被解析为 path、params、query 三者之一中的一部分
result1 = urllib.parse.urlparse(url=url1, allow_fragments=False)
result2 = urllib.parse.urlparse(url=url2, allow_fragments=False)
result3 = urllib.parse.urlparse(url=url3, allow_fragments=False)
result4 = urllib.parse.urlparse(url=url4, allow_fragments=False)
print(result1)
print(result2)
print(result3)
print(result4)
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='kw=Python&id=123#urlparse', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user#urlparse', query='', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#urlparse', params='', query='', fragment='')
ParseResult(scheme='http', netloc='www.baidu.com', path='/#urlparse', params='', query='', fragment='')
urlunparse()
"""
urlunparse() 方法刚好与 urlparse() 方法是对立的, 它接收一个长度只能为 6 的可迭代对象作为参数
"""
import urllib.parse
data = ['http', 'www.baidu.com', 'index.html', 'user', 'kw=Python&id=123', 'urlparse']
url = urllib.parse.urlunparse(data)
print(url)
http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse
urlsplit()
"""
urlsplit() 方法与 urlparse() 方法类似, 只不过它不会单独解析 parameters 这一部分,
所以返回结果只有 5 个部分, parameters 会被合并到 path 中
"""
import urllib.parse
url = 'http://www.baidu.com/index.html;user?kw=Python&id=123#urlparse'
result = urllib.parse.urlsplit(url)
print(result)
print(result[0], '\n', result.scheme) # 返回的是元组, 可以用属性或者索引获取结果值
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='kw=Python&id=123', fragment='urlparse')
http
http
urlunsplit()
"""
urlsplit() 方法与 urlunparse() 方法类似, 区别是它接收一个长度只能为 5 的可迭代对象作为参数
"""
import urllib.parse
data = ('http', 'www.baidu.com', 'index.html', 'kw=Python&id=123', 'urlparse')
url = urllib.parse.urlunsplit(data)
print(url)
http://www.baidu.com/index.html?kw=Python&id=123#urlparse
urljoin()
"""
urljoin() 方法可以完成 url 链接的拼接, 我们可以提供一个 base_url
作为基础链接, 再提供一个完整或部分链接作为 urljoin() 的第二个参数,
来对链接进行拼接
"""
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com/', 's?wd=Python'))
print(urljoin('http://www.baidu.com', 's?wd=Python'))
print(urljoin('http://www.baidu.com/index', 'https://www.python.org/'))
print(urljoin('http://www.baidu.com/s?wd=Python', 'https://www.python.org/'))
print(urljoin('http://www.baidu.com/', 'https://www.python.org/index'))
print(urljoin('http://www.baidu.com/s?wd=Python%tn=baidu', 's?wd=Python'))
print(urljoin('http://www.baidu.com/tn=baidu', 's?wd=Python#urljoin'))
print(urljoin('www.baidu.com/', 's?wd=Python'))
print(urljoin('www.baidu.com', 's?wd=Python'))
print(urljoin('www.baidu.com', '?wd=Python'))
http://www.baidu.com/s?wd=Python
http://www.baidu.com/s?wd=Python
https://www.python.org/
https://www.python.org/
https://www.python.org/index
http://www.baidu.com/s?wd=Python
http://www.baidu.com/s?wd=Python#urljoin
www.baidu.com/s?wd=Python
s?wd=Python
www.baidu.com?wd=Python
urlencode()
"""
urlencode() 方法用来将字典类型的键值对序列化成 URL 标准的 GET 请求参数形式
"""
from urllib.parse import urlencode
params = {
'name': 'Python中文', # 中文会被编码成 URL 编码格式
'age': 10
}
base_url = 'http://www.baidu.com?'
url = f'{base_url}{urlencode(params)}'
print(url)
http://www.baidu.com?name=Python%E4%B8%AD%E6%96%87&age=10
parse_qs()
"""
parse_qs() 方法与 urlencode() 方法刚好相反, 此方法将 GET 请求参数反序列化成字典
"""
from urllib.parse import parse_qs
query = 'name=Python%E4%B8%AD%E6%96%87&age=10'
qs = parse_qs(query)
print(qs)
{'name': ['Python中文'], 'age': ['10']}
parse_qsl()
"""
parse_qsl() 方法与 parse_qs() 方法类似, 它可以将 GET 请求中的参数部分转换成由元组组成的列表
"""
from urllib.parse import parse_qsl, urlparse
url = 'http://www.baidu.com?name=Python%E4%B8%AD%E6%96%87&age=10'
query = urlparse(url).query
qsl = parse_qsl(query)
print(qsl)
[('name', 'Python中文'), ('age', '10')]
quote()
"""
quote() 方法可以将内容转换成 URL 编码的格式, 当遇到中文的时候可以使用此方法对其进行编码
"""
from urllib.parse import quote
keyword = 'Python中国'
url = f'http://www.baidu.com/s?wd={quote(keyword)}'
print(url)
http://www.baidu.com/s?wd=Python%E4%B8%AD%E5%9B%BD
unquote()
"""
unquote() 方法与 quote() 方法相反, 是对 URL 进行解码
"""
from urllib.parse import unquote
url = 'http://www.baidu.com/s?wd=Python%E4%B8%AD%E5%9B%BD'
print(unquote(url))
http://www.baidu.com/s?wd=Python中国