urllib库提供了parse模块, 它定义了处理url的标准接口,实现url各部分饿抽取,合并以及链接的转换。
实现URL的识别和分段
from urllib.parse import urlparse
result = urlparse("http://wwww,baidu.com/index.html;user?id=5#comment")
# 输出解析类型和和解析结果
print(type(result), result, sep="\n")
运行结果:
urlparse()将URL拆分为6个部分:
`def urlparse(url, scheme=’’, allow_fragments=True):
result = urlparse("wwww,baidu.com/index.html;user?id=5#comment", scheme="https")
print(result)
当我们提供的URL中没有带scheme信息时,拿参数提供的协议作为结果返回
当我们提供的URL中带有scheme信息时,以url中的协议为准,参数提供的协议信息无效
result = urlparse("http://wwww,baidu.com/index.html;user?id=5#comment", allow_fragments=False)
print(result)
result = urlparse("http://wwww,baidu.com/index.html#comment", allow_fragments=False)
print(result)
print(result.scheme, result[0], result.netloc, result[1], sep="\n")
parseResult实际上是一个元组,我们可以用索引顺序来获取,也可以用属性名获取。
urlunparse()接受的参数是一个可迭代对象,但是长度必须为6,否则会抛出异常。
def urlunparse(components):scheme, netloc, url, query, fragment, _coerce_result = (
_coerce_args(*components))
from urllib.parse import urlunparse
data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
print(urlunparse(data))
会返回5个结果,其中的params会合并到path中,返回的SplitResult也是一个元组类型
from urllib.parse import urlsplit
result = urlsplit("http://wwww,baidu.com/index.html;user?id=5#comment")
print(result)
print(result.scheme, result[0], sep="\n")
它可以将链接各个部分组合成完整的连接,但是传入的参数是一个可迭代的对象,例如元组,列表等,长度必须为5.
data = ['http', 'www.baidu.com', 'index.html', 'a=6', 'comment']
print(urlunsplit(data))
提供一个baseUrl,将新的链接作为第二个参数,该方法解析base_url的scheme,netloc,和path这三个内容对新链接进行补充,然后返回结果。
def urljoin(base, url, allow_fragments=True):
# http://www.baidu.com/FAQ,html
print(urljoin("http://www.baidu.com", "FAQ,html"))
# https://www.baidu.com/FAQ,html 根据第二个参数进行补全
print(urljoin("http://www.baidu.com", "https://www.baidu.com/FAQ,html"))
# https://cuiqingcai.com/FAQ.html
print(urljoin("http://www.baidu.com/about.html", "https://cuiqingcai.com/FAQ.html"))
# https://cuiqingcai.com/FAQ.html?question=2
print(urljoin("http://www.baidu.com/about.html", "https://cuiqingcai.com/FAQ.html?question=2"))
# http://www.baidu.com?category=2#comment
print(urljoin("http://www.baidu.com", "?category=2#comment"))
# www.baidu.com?category=2#comment
print(urljoin("www.baidu.com", "?category=2#comment"))
# www.baidu.com?category=2
print(urljoin("www.baidu.com#comment", "?category=2"))
base_url提供了三项内容scheme,netloc,path,如果这三项在新的链接中不存在,就会进行补充;如果新的链接中存在,就使用新的链接中的部分。
将请求参数序列化
from urllib.parse import urlencode
# 声明一个字典将参数表示出来,调用urlencode()方法将其序列化为GET请求的参数
params = {
'name': 'germy',
'age': 27
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)
反序列化,将参数转换为字典
from urllib.parse import parse_qs
# 反序列化,将参数转化为字典
query = 'name=gery&age=22'
print(parse_qs(query))
将参数转化为元组组成的列表
from urllib.parse import parse_qsl
# 将参数转化为元组组成的列表
query = 'name=gery&age=22'
print(parse_qsl(query))
该方法可以将内容转化为URL编码的格式,URL中带有中文参数时,有时候可能会导致乱码问题,用这个可以将中文符转换为url编码
from urllib.parse import quote
keyword = '壁纸'
url = "https://www,baidu.com/s?wd="+quote(keyword)
print(url)
对URL编码进行解码
from urllib.parse import unquote
# 对URL编码进行解码
url = "https://www,baidu.com/s?wd=%E5%A3%81%E7%BA%B8"
print(unquote(url))