urllib.parse - 將URL解析為組件
urllib.parse
定義了一個標准接口,用於在組件中解析統一資源定位符(URL)字符串(尋址方案,網絡位置,路徑等),將組件組合回URL字符串,並將“相對URL”轉換為絕對URL給出“基本URL”。
該模塊旨在匹配相對統一資源定位器上的Internet RFC。它支持下列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
。
urllib.parse
模塊定義了分為兩大類的功能:URL解析和URL引用。
URL解析
URL解析功能側重於將URL字符串拆分為其組件,或者將URL組件組合為URL字符串。
urllib.parse.urlparse(urlstring,scheme ='',allow_fragments = True )
-
將URL解析為六個組件,返回一個6個元素的元組,對應URL的一般結構:
scheme://netloc/path;parameters?query#fragment
。每個元組項都是一個字符串,可能為空。組件不會以較小的部分分解(例如,網絡位置是單個字符串),並且不會展開%escapes。如上所示的分隔符不是結果的一部分,除了路徑組件中的前導斜杠,如果存在則保留。例如:>>> from urllib.parse import urlparse >>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html') >>> o ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> o.scheme 'http' >>> o.port 80 >>> o.geturl() 'http://www.cwi.nl:80/%7Eguido/Python.html'
-
只有在'//'正確引入的情況下, urlparse才會識別netloc。否則,假定輸入是一個相對URL,將以路徑組件開始
>>> from urllib.parse import urlparse >>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html') ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('www.cwi.nl/%7Eguido/Python.html') ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('help/Python.html') ParseResult(scheme='', netloc='', path='help/Python.html', params='', query='', fragment='')
-
scheme參數給出了默認的尋址方案,只有在URL沒有指定尋址方案時才使用。它應該是與urlstring相同的類型(文本或字節),只是默認值
''
總是允許的,並在適當時自動轉換為''
。如果
allow_fragments
參數為false,則無法識別片段標識符。相反,它們被解析為路徑,參數或查詢組件的一部分,並fragment
在返回值中設置為空字符串。返回值是一個元組,這樣我們可以通過索引或者嗎命名屬性訪問,如下:
屬性 索引 值 Value if not present scheme 0 協議 scheme參數 netloc 1 網絡位置部分 空字符串 path 2 分層路徑 空字符串 params 3 最后一個路徑元素的參數 空字符串 query 4 查詢 空字符串 fragment 5 信息片段 空字符串 username 用戶名 None password 密碼 None hostname 主機名 None port 端口號 None -
如果在URL中指定了無效端口,則讀取該
port
屬性將引發ValueError
異常。 -
netloc屬性中不匹配的方括號將引發ValueError。
-
與所有命名元組的情況一樣,子類還有一些特別有用的附加方法和屬性。一種這樣的方法是
_replace()
。該_replace()
方法將返回一個新的ParseResult對象,用新值替換指定的字段。>>> from urllib.parse import urlparse >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html') >>> u ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> u._replace(scheme='http') ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
urllib.parse.parse_qs(qs,keep_blank_values = False,strict_parsing = False,encoding ='utf-8',errors ='replace',max_num_fields = None )
- 解析作為字符串參數給出的查詢字符串(類型為 application / x-www-form-urlencoded的數據)。數據作為字典返回。字典鍵是唯一的查詢變量名稱,值是每個名稱的值列表。
- 可選參數keep_blank_values是一個標志,指示百分比編碼查詢中的空值是否應被視為空字符串。true值表示空格應保留為空字符串。默認的false值表示將忽略空白值並將其視為未包含它們。
- 可選參數strict_parsing是一個標志,指示如何處理解析錯誤。如果為false(默認值),則會以靜默方式忽略錯誤。如果為true,則錯誤會引發ValueError異常。
- 可選的編碼和錯誤參數指定如何將百分比編碼的序列解碼為Unicode字符,正如
bytes.decode()
方法所接受的那樣。 - 可選參數max_num_fields是要讀取的字段的最大數量。如果設置,則如果讀取的字段超過max_num_fields,則拋出ValueError。
- 使用urllib.parse.urlencode()函數(doseq參數設置為True)將這些字典轉換成查詢字符串。
urllib.parse.parse_qsl(qs,keep_blank_values = False,strict_parsing = False,encoding ='utf-8',errors ='replace',max_num_fields = None )
- 將給定的查詢字符串解析為字符串參數(類型為application/x-www-form-urlencoded的數據)。數據作為名稱、值對列表返回。
- 可選參數
keep_blank_values
是一個標志,指示百分比編碼的查詢中的空白值是否應該被視為空白字符串。true值指示空白應保留為空白字符串。默認的false值表示要忽略空白值,並將其視為未包含。 - 可選參數
strict_parser
是一個標志,指示如何處理解析錯誤。如果為false(默認值),錯誤將被默認忽略。如果為真,錯誤將引發ValueError異常。 - 可選的
encoding
和errors
參數指定如何將百分比編碼的序列解碼為Unicode字符,正如bytes.decode()方法所接受的那樣。 - 可選參數
max_num_fields
是要讀取的字段的最大數量。如果設置,則如果讀取的字段超過max_num_fields,則拋出ValueError。 - 使用urllib.parse.urlencode()函數將這些對列表轉換為查詢字符串。
urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)
-
這類似於urlparse(),但不會從URL中分割參數。如果需要將允許參數應用於URL路徑部分的每個段的最新URL語法(請參閱RFC 2396),則通常應該使用該方法而不是urlparse()。需要一個單獨的函數來分離路徑段和參數。這個函數返回5個(對比 urlparse沒有params)元素的元組:
(addressing scheme, network location, path, query, fragment identifier)