我正在嘗試使用 urlparse Python 庫來決議一些自定義 URI。
我注意到一些眾所周知的方案params被正確決議:
>>> from urllib.parse import urlparse
>>> urlparse("http://some.domain/some/nested/endpoint;param1=value1;param2=othervalue2?query1=val1&query2=val2#fragment")
ParseResult(scheme='http', netloc='some.domain', path='/some/nested/endpoint', params='param1=value1;param2=othervalue2', query='query1=val1&query2=val2', fragment='fragment')
>>> urlparse("ftp://some.domain/some/nested/endpoint;param1=value1;param2=othervalue2?query1=val1&query2=val2#fragment")
ParseResult(scheme='ftp', netloc='some.domain', path='/some/nested/endpoint', params='param1=value1;param2=othervalue2', query='query1=val1&query2=val2', fragment='fragment')
...但對于定制的 - 他們不是。params欄位保持為空。相反, params 被視為以下內容的一部分path:
>>> urlparse("scheme://some.domain/some/nested/endpoint;param1=value1;param2=othervalue2?query1=val1&query2=val2#fragment")
ParseResult(scheme='scheme', netloc='some.domain', path='/some/nested/endpoint;param1=value1;param2=othervalue2', params='', query='query1=val1&query2=val2', fragment='fragment')
為什么決議取決于模式?如何urlparse使用自定義模式決議庫中的引數?
uj5u.com熱心網友回復:
這是因為urlparse假設只有一組方案將使用其 URL 格式的引數。您可以在源代碼中看到該檢查。
if scheme in uses_params and ';' in url:
url, params = _splitparams(url)
else:
params = ''
這意味著urlparse僅當方案在uses_params(這是已知方案的串列)時才嘗試決議引數。
uses_params = ['', 'ftp', 'hdl', 'prospero', 'http', 'imap',
'https', 'shttp', 'rtsp', 'rtspu', 'sip', 'sips',
'mms', 'sftp', 'tel']
因此,要獲得預期的輸出,您可以將自定義方案附加到uses_params串列中并再次執行urlparse呼叫。
>>> from urllib.parse import uses_params, urlparse
>>>
>>> uses_params.append('scheme')
>>> urlparse("scheme://some.domain/some/nested/endpoint;param1=value1;param2=othervalue2?query1=val1&query2=val2#fragment")
ParseResult(scheme='scheme', netloc='some.domain', path='/some/nested/endpoint', params='param1=value1;param2=othervalue2', query='query1=val1&query2=val2', fragment='fragment')
uj5u.com熱心網友回復:
您可以從網址中洗掉該自定義方案嗎?那總是會回傳引數
urlparse("//some.domain/some/nested/endpoint;param1=value1;param2=othervalue2?query1=val1&query2=val2#fragment")
ParseResult(scheme='', netloc='some.domain', path='/some/nested/endpoint', params='param1=value1;param2=othervalue2', query='query1=val1&query2=val2', fragment='fragment')
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/520174.html
