from urllib import parse模塊的使用:url的解析,合並,編碼,解碼


前言

 ①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))

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM