【python】urllib.parse url解析

1、模塊功能
該模塊用于將URL字符串拆分為不同部分:協(xié)議、網(wǎng)絡(luò)位置、路徑、參數(shù)、查詢組件、片段標(biāo)識符。
首先了解一下url的結(jié)構(gòu),每個URL的主要結(jié)構(gòu)如下:
scheme://netloc/path;parameters?query#fragment
舉個例子:

每個字段含義:
scheme: url協(xié)議說明符,比如http、https
netloc: 網(wǎng)絡(luò)位置,比如域名、ip
path: 資源路徑,網(wǎng)絡(luò)位置上的具體路徑,相當(dāng)于你電腦上某個文件的路徑
query: 查詢組件,是一些鍵值組合
fragment: 片段標(biāo)識符,用來定位在頁面的哪個位置
除了例子中的字段,還有一些其他字段:
params: 參數(shù),不過已經(jīng)不再使用這個字段了
username: 用戶名
password: 密碼
hostname: 小寫主機(jī)名
port: 端口號
2、模塊安裝
安裝好python之后就有這個庫。
3、模塊使用
urllib.parse中方法一句話總結(jié),標(biāo)紅函數(shù)經(jīng)常使用:
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()的結(jié)果構(gòu)造成URL。
urllib.parse.urlsplit(): 類似urlparse(),但是少了params字段。
urllib.parse.urlunsplit(): 將urlsplit()結(jié)果再構(gòu)造回URL。
urllib.parse.urljoin(base, url):? 拼接URL,會把baseurl和url合并。通常會保留baseurl的scheme和netloc
urllib.parse.urldefrag(url): 可以將url中的fragment和前面的內(nèi)容分開,可以通過索引或明明屬性獲取到分割之后的url和fragment。
urllib.parse.unwrap(): 本地測試沒有找到該方法。。。
urllib.parse.quote(): 將一些特殊字符轉(zhuǎn)換為轉(zhuǎn)義符,比如:":"轉(zhuǎn)義為"%3A";“?”轉(zhuǎn)義為“%3F”;"="轉(zhuǎn)義為“%3D”;空格“ ”轉(zhuǎn)義為"%20".
urllib.parse.quote_plus(str): 和quote類似,但是空格會被轉(zhuǎn)義為"+"。
urllib.parse.quote_from_bytes(bytes): 和quote類似,但是參數(shù)為bytes對象。
urllib.parse.unquote(): 和quote()相反,將轉(zhuǎn)義符替換為原本的字符,比如會把"%3A"轉(zhuǎn)義為":"。
urllib.parse.unquote_plus(): 和unquote()類似,但是遇到“+”,還是會被轉(zhuǎn)義為空格。
urllib.parse.unquote_to_bytes(str): 將轉(zhuǎn)義符替換為bytes類型的字符,比如會將“%3A”替換為"b':'"
urllib.parse.urlencode(): 將一個包含有str或bytes對象的映射對象或二元組序列轉(zhuǎn)換為以百分號編碼的ASCII文本字符串。
可以結(jié)合代碼觀察觀察運行結(jié)果:
#!/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)
運行結(jié)果:

4、遇到的問題
4.1 怎么url中query字段之前的內(nèi)容,不包括“?”
比如url是“https://www.xxx.com?a=123”只獲取“https://www.xxx.com”,沒發(fā)現(xiàn)好辦法,字符串截取或拼接吧。
5、參考資料
5.1?https://docs.python.org/zh-cn/3.9/library/urllib.parse.html?highlight=urllib#module-urllib.parse