【python】urllib.parse url解析
1、模块功能
该模块用于将URL字符串拆分为不同部分:协议、网络位置、路径、参数、查询组件、片段标识符。
首先了解一下url的结构,每个URL的主要结构如下:
scheme://netloc/path;parameters?query#fragment
举个例子:

每个字段含义:
scheme: url协议说明符,比如http、https
netloc: 网络位置,比如域名、ip
path: 资源路径,网络位置上的具体路径,相当于你电脑上某个文件的路径
query: 查询组件,是一些键值组合
fragment: 片段标识符,用来定位在页面的哪个位置
除了例子中的字段,还有一些其他字段:
params: 参数,不过已经不再使用这个字段了
username: 用户名
password: 密码
hostname: 小写主机名
port: 端口号
2、模块安装
安装好python之后就有这个库。
3、模块使用
urllib.parse中方法一句话总结,标红函数经常使用:
urllib.parse.urlparse(): 将url解析为六个部分(scheme、netloc、path、params、query、fragment)
urllib.parse.parse_qs(): 返回字典,配合urllib.parse.urlparse()的query字段可摘取查询信息。
urllib.parse.parse_qsl(): 返回列表,元素是元组,配合urllib.parse.urlparse()的query字段可摘取查询信息。
urllib.parse.urlunparse(): 返回url,把urlparse()的结果构造成URL。
urllib.parse.urlsplit(): 类似urlparse(),但是少了params字段。
urllib.parse.urlunsplit(): 将urlsplit()结果再构造回URL。
urllib.parse.urljoin(base, url): 拼接URL,会把baseurl和url合并。通常会保留baseurl的scheme和netloc
urllib.parse.urldefrag(url): 可以将url中的fragment和前面的内容分开,可以通过索引或明明属性获取到分割之后的url和fragment。
urllib.parse.unwrap(): 本地测试没有找到该方法。。。
urllib.parse.quote(): 将一些特殊字符转换为转义符,比如:":"转义为"%3A";“?”转义为“%3F”;"="转义为“%3D”;空格“ ”转义为"%20".
urllib.parse.quote_plus(str): 和quote类似,但是空格会被转义为"+"。
urllib.parse.quote_from_bytes(bytes): 和quote类似,但是参数为bytes对象。
urllib.parse.unquote(): 和quote()相反,将转义符替换为原本的字符,比如会把"%3A"转义为":"。
urllib.parse.unquote_plus(): 和unquote()类似,但是遇到“+”,还是会被转义为空格。
urllib.parse.unquote_to_bytes(str): 将转义符替换为bytes类型的字符,比如会将“%3A”替换为"b':'"
urllib.parse.urlencode(): 将一个包含有str或bytes对象的映射对象或二元组序列转换为以百分号编码的ASCII文本字符串。
可以结合代码观察观察运行结果:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from urllib import parse
if __name__ == "__main__":
url = "https://docs.python.org/zh-cn/3/library/urllib.parse.html?highlight=urllib#module-urllib.parse"
qs = parse.urlparse(url)
print("=" * 50)
print(f"urlparse: {qs}")
print(f"scheme: {qs.scheme}")
print(f"netloc: {qs.netloc}")
print(f"path: {qs.path}")
print(f"query: {qs.query}")
print(f"fragment: {qs.fragment}")
print("=" * 50)
parse_qs = parse.parse_qs(qs.query)
print(f"parse_qs: {parse_qs}")
print("=" * 50)
parse_qsl = parse.parse_qsl(qs.query)
print(f"parse_qsl: {parse_qsl}")
print("=" * 50)
urlunparse = parse.urlunparse(qs)
print(f"urlunparse: {urlunparse}")
print("=" * 50)
urlsplit = parse.urlsplit(url)
print(f"urlsplit: {urlsplit}")
print("=" * 50)
urlunsplit = parse.urlunsplit(urlsplit)
print(f"urlunsplit: {urlunsplit}")
print("=" * 50)
urljoin = parse.urljoin("https://docs.python.org/zh-cn/3/library/urllib.parse.html", "/xxx/test.html")
print(f"urljoin: {urljoin}")
print("=" * 50)
urldefrag = parse.urldefrag(url)
print(f"urldefrag: {urldefrag}")
print(f"url: {urldefrag.url}")
print(f"fragment: {urldefrag.fragment}")
print("=" * 50)
quote = parse.quote(" ")
print(f"quote; {quote}")
print("=" * 50)
quote_plus = parse.quote_plus(" ")
print(f"quote_plus; {quote_plus}")
print("=" * 50)
quote_from_bytes = parse.quote_from_bytes(b" ")
print(f"quote_from_bytes; {quote_from_bytes}")
print("=" * 50)
unquote = parse.unquote("%3A")
print(f"unquote; {unquote}")
print("=" * 50)
unquote_plus = parse.unquote_plus("+")
print(f"unquote_plus; {unquote_plus}")
print("=" * 50)
unquote_to_bytes = parse.unquote_to_bytes("%3A")
print(f"unquote_to_bytes; {unquote_to_bytes}")
print("=" * 50)
urlencode = parse.urlencode(parse_qs)
print(f"urlencode; {urlencode}")
print("=" * 50)运行结果:

4、遇到的问题
4.1 怎么url中query字段之前的内容,不包括“?”
比如url是“https://www.xxx.com?a=123”只获取“https://www.xxx.com”,没发现好办法,字符串截取或拼接吧。
5、参考资料
5.1 https://docs.python.org/zh-cn/3.9/library/urllib.parse.html?highlight=urllib#module-urllib.parse

