前言
①urllib.parse 模塊提供了一些函數,可以管理URL及其組成部分,這包括將URL分解為組成部分以及由組成部分構成URL。
②urllib庫的parse模塊(英文單詞parse的意思是解析,理解為解析url的模塊)定義了url的標准接口,實現url的各種抽取。
③parse模塊的作用:url的解析,合並,編碼,解碼
urlparse:實現url的識別和分段
參數:
① url :待解析的url。
② scheme='' :假如解析的url沒有協議,可以設置默認的協議;但是如果url存在協議,設置scheme參數無效。
③ allow_fragments=True :是否忽略錨點,默認為True表示不忽略,為False表示忽略。
代碼1:
from urllib import parse url = 'https://www.cnblogs.com/angelyan/'
result = parse.urlparse(url=url,scheme='http',allow_fragments=True)
print(result) print(result.scheme)
運行結果:由於解析的url是https協議,所以scheme參數指定的協議無效
代碼2:
from urllib.parse import urlparse url = 'http://user:pwd@NetLoc:80/path;param?query=arg#frag' parsed = urlparse(url) print(parsed) print('scheme :', parsed.scheme) print('netloc :', parsed.netloc) print('path :', parsed.path) print('params :', parsed.params) print('query :', parsed.query) print('fragment:', parsed.fragment) print('username:', parsed.username) print('password:', parsed.password) print('hostname:', parsed.hostname) print('port :', parsed.port)
運行結果:盡管返回值相當於一個元組,但實際上它基於一個 namedtuple ,這是 tuple的一個子類,除了可以通過索引訪問,它還支持通過命名屬性訪問URL的各部分。
屬性API不僅更易於程序員使用,還允許訪問tupleAPI中未提供的很多值。
url解析后的返回值參數含義:
(scheme='https', netloc='www.cnblogs.com', path='/angelyan/', params='', query='', fragment='')
① scheme :表示url使用的網絡協議
② netloc :域名
③ path :路徑
④ params :參數
⑤ query :查詢條件,一般都是get請求的url才會有此出參
⑥ fragment :錨點,用於直接定位頁面的下拉位置,跳轉到網頁的指定位置
urlsplit函數可以替換urlparse
但是urlsplit函數不會從URL分解參數
代碼:
from urllib.parse import urlsplit url = 'http://user:pwd@NetLoc:80/p1;para/p2;para?query=arg#frag' parsed = urlsplit(url) print(parsed) print('scheme :', parsed.scheme) print('netloc :', parsed.netloc) print('path :', parsed.path) print('query :', parsed.query) print('fragment:', parsed.fragment) print('username:', parsed.username) print('password:', parsed.password) print('hostname:', parsed.hostname) print('port :', parsed.port)
運行結果:由於沒有分解參數,tuple API會顯示五個元素而不是六個,並且這里沒有params屬性。
要想從一個URL剝離出片段標識符:如從一個URL查找基頁面名,可以使用 urldefrag() 函數。
from urllib.parse import urldefrag original = 'http://netloc/path;param?query=arg#frag' print('original:', original) d = urldefrag(original) print('url :', d.url) print('fragment:', d.fragment)
運行結果:
urlunparse:利用urlunparse()可以將包含串的普通元組重新組合為一個URL。
代碼:
from urllib import parse # components:是一個可迭代對象,長度必須為6 url_parmas1 = ('https', 'www.cnblogs.com', '/angelyan/', '', 'name=maple', 'log') result1 = parse.urlunparse(url_parmas1) print(result1) url_parmas2 = ('https', 'www.cnblogs.com', '/angelyan/', '', '', '') result2 = parse.urlunparse(url_parmas2) print(result2) url_parmas3 = ('https', 'www.cnblogs.com', '/AnyPath/', '', 'name=maple&sex=man', '') result3 = parse.urlunparse(url_parmas3) print(result3) url_parmas4 = ('https', 'www.cnblogs.com', '/AnyPath/', 'js', 'name=maple&sex=man', '') result4 = parse.urlunparse(url_parmas4) print(result4)
運行結果:由此可以看出,在一個長度為6的普通元組內,位置不同的元素代表的意義也不相同;可以參考 urlprase() 函數將標准URL解析后的元組內的各元素定位。
geturl:geturl()方法
代碼:
from urllib.parse import urlparse original = 'http://netloc/path;param?query=arg#frag' print('ORIG :', original) parsed = urlparse(original) print('PARSED:', parsed.geturl())
運行結果: geturl() 只適用於 urlparse() 或 urlsplit() 返回的對象。
urljoin:URL的相對片段構造絕對URL
可以類比: os.path.join()
代碼1:
from urllib import parse base_url = 'https://www.cnblogs.com' sub_url = '/AnyPath/?name=maple&sex=man#log' full_url = parse.urljoin(base=base_url, url=sub_url, allow_fragments=True) print(full_url)
運行結果:
代碼2:
from urllib.parse import urljoin print(urljoin('http://www.example.com/path/file.html', 'anotherfile.html')) print(urljoin('http://www.example.com/path/file.html', '../anotherfile.html'))
運行結果:在該例子中,計算第二個URL時要考慮路徑的相對部分 "../" 。
代碼3:
from urllib.parse import urljoin print(urljoin('http://www.example.com/path/', '/subpath/file.html')) print(urljoin('http://www.example.com/path/', 'subpath/file.html'))
運行結果:
①如果連接到URL的路徑是以一個斜線開頭(/),那么 urljoin() 方法會把URL的路徑重置為頂級路徑。
②如果連接到URL的路徑不是以一個斜線開頭,那么新路徑值則追加到URL當前路徑的末尾。
urlencode:將字典格式的參數序列化為url編碼后的字符串,常用來構造get請求和post請求的參數
此時使用requests庫請求接口會使用params形參
代碼1:
from urllib import parse parmas = { 'name': 'maple', 'age': 18 } parmas_str = parse.urlencode(parmas) print('將字典格式的數據序列化為url編碼后的字符串:', parmas_str) parmas_str = 'name=maple&age=18' # 將url編碼格式的參數反序列化為字典類型 parmas = parse.parse_qs(parmas_str) print('將url編碼后的字符串反序列化為字典格式的數據:', parmas)
運行結果:
代碼2:
from urllib import parse parmas = { 'name': '漢語參數', 'age': 18 } parmas_str = parse.urlencode(parmas) print('將字典格式的數據序列化為url編碼后的字符串:', parmas_str) parmas_str = 'name=%E6%B1%89%E8%AF%AD%E5%8F%82%E6%95%B0&age=18' # 將url編碼格式的參數反序列化為字典類型 parmas = parse.parse_qs(parmas_str) print('將url編碼后的字符串反序列化為字典格式的數據:', parmas)
運行結果:
quote:可以將中文轉換為url編碼格式
代碼:
from urllib import parse word = '中國夢' url = 'http://www.baidu.com/s?wd='+parse.quote(word) print('將中文參數轉換為url編碼格式后的參數:', parse.quote(word)) print('將中文參數轉換為url編碼格式后的新的url', url) # unquote:可以將URL編碼進行解碼 url = 'http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD%E6%A2%A6' print('url解碼之后新的url:', parse.unquote(url))
運行結果: