欢迎光临散文网 会员登陆 & 注册

【python】urllib.parse url解析

2022-01-28 13:54 作者:阿提艾斯  | 我要投稿

1、模块功能

该模块用于将URL字符串拆分为不同部分:协议、网络位置、路径、参数、查询组件、片段标识符。

首先了解一下url的结构,每个URL的主要结构如下:

scheme://netloc/path;parameters?query#fragment

举个例子:


url结构

每个字段含义:

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

【python】urllib.parse url解析的评论 (共 条)

分享到微博请遵守国家法律