小編給大家分享一下Python3中如何使用Urllib解析鏈接,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
站在用戶的角度思考問題,與客戶深入溝通,找到閻良網(wǎng)站設(shè)計(jì)與閻良網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請(qǐng)、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋閻良地區(qū)。
Urllib 庫里還提供了 parse 這個(gè)模塊,它定義了處理 URL 的標(biāo)準(zhǔn)接口,例如實(shí)現(xiàn) URL 各部分的抽取,合并以及鏈接轉(zhuǎn)換。它支持如下協(xié)議的 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。
urlparse() 方法可以實(shí)現(xiàn) URL 的識(shí)別和分段,我們先用一個(gè)實(shí)例來感受一下:
from urllib.parse import urlparse result = urlparse('http://www.baidu.com/index.html;user?id=5#comment') print(type(result), result)
在這里我們利用了 urlparse() 方法進(jìn)行了一個(gè) URL 的解析,首先輸出了解析結(jié)果的類型,然后將結(jié)果也輸出出來。
運(yùn)行結(jié)果:
<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment') Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
觀察可以看到,返回結(jié)果是一個(gè) ParseResult 類型的對(duì)象,它包含了六個(gè)部分,分別是 scheme、netloc、path、params、query、fragment。
觀察一下實(shí)例的URL:
http://www.baidu.com/index.html;user?id=5#comment
urlparse() 方法將其拆分成了六部分,大體觀察可以發(fā)現(xiàn),解析時(shí)有特定的分隔符,比如 :// 前面的就是 scheme,代表協(xié)議,第一個(gè) / 前面便是 netloc,即域名,分號(hào) ; 前面是 params,代表參數(shù)。
所以可以得出一個(gè)標(biāo)準(zhǔn)的鏈接格式如下:
scheme://netloc/path;parameters?query#fragment
一個(gè)標(biāo)準(zhǔn)的 URL 都會(huì)符合這個(gè)規(guī)則,利用 urlparse() 方法我們可以將它解析拆分開來。
除了這種最基本的解析方式,urlopen() 方法還有其他配置嗎?接下來看一下它的 API 用法:
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
可以看到它有三個(gè)參數(shù):
urlstring,是必填項(xiàng),即待解析的 URL。
scheme,是默認(rèn)的協(xié)議(比如http、https等),假如這個(gè)鏈接沒有帶協(xié)議信息,會(huì)將這個(gè)作為默認(rèn)的協(xié)議。
我們用一個(gè)實(shí)例感受一下:
from urllib.parse import urlparse result = urlparse('www.baidu.com/index.html;user?id=5#comment', scheme='https') print(result)
運(yùn)行結(jié)果:
ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='id=5', fragment='comment')
可以發(fā)現(xiàn),我們提供的 URL 沒有包含最前面的 scheme 信息,但是通過指定默認(rèn)的 scheme 參數(shù),返回的結(jié)果是 https。
假設(shè)我們帶上了 scheme 呢?
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment', scheme='https')
結(jié)果如下:
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
可見 scheme 參數(shù)只有在 URL 中不包含 scheme 信息時(shí)才會(huì)生效,如果 URL 中有 scheme 信息,那就返回解析出的 scheme。
allow_fragments,即是否忽略 fragment,如果它被設(shè)置為 False,fragment 部分就會(huì)被忽略,它會(huì)被解析為 path、parameters 或者 query 的一部分,fragment 部分為空。
下面我們用一個(gè)實(shí)例感受一下:
from urllib.parse import urlparse result = urlparse('http://www.baidu.com/index.html;user?id=5#comment', allow_fragments=False) print(result)
運(yùn)行結(jié)果:
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5#comment', fragment='')
假設(shè) URL 中不包含 parameters 和 query 呢?
再來一個(gè)實(shí)例看下:
from urllib.parse import urlparse result = urlparse('http://www.baidu.com/index.html#comment', allow_fragments=False) print(result)
運(yùn)行結(jié)果:
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#comment', params='', query='', fragment='')
可以發(fā)現(xiàn)當(dāng) URL 中不包含 params 和 query 時(shí), fragment 便會(huì)被解析為 path 的一部分。
返回結(jié)果 ParseResult 實(shí)際上是一個(gè)元組,我們可以用索引順序來獲取,也可以用屬性名稱獲取,實(shí)例如下:
from urllib.parse import urlparse result = urlparse('http://www.baidu.com/index.html#comment', allow_fragments=False) print(result.scheme, result[0], result.netloc, result[1], sep='\n')
在這里我們分別用索引和屬性名獲取了 scheme 和 netloc,運(yùn)行結(jié)果如下:
http http www.baidu.com www.baidu.com
可以發(fā)現(xiàn)二者結(jié)果是一致的,兩種方法都可以成功獲取。
有了 urlparse() 那相應(yīng)地就有了它的對(duì)立方法 urlunparse()。
它接受的參數(shù)是一個(gè)可迭代對(duì)象,但是它的長(zhǎng)度必須是 6,否則會(huì)拋出參數(shù)數(shù)量不足或者過多的問題。
先用一個(gè)實(shí)例感受一下:
from urllib.parse import urlunparse data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment'] print(urlunparse(data))
參數(shù) data 用了列表類型,當(dāng)然你也可以用其他的類型如元組或者特定的數(shù)據(jù)結(jié)構(gòu)。
運(yùn)行結(jié)果如下:
http://www.baidu.com/index.html;user?a=6#comment
這樣我們就成功實(shí)現(xiàn)了 URL 的構(gòu)造。
這個(gè)和 urlparse() 方法非常相似,只不過它不會(huì)單獨(dú)解析 parameters 這一部分,只返回五個(gè)結(jié)果。上面例子中的 parameters 會(huì)合并到 path中,用一個(gè)實(shí)例感受一下:
from urllib.parse import urlsplit result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment') print(result)
運(yùn)行結(jié)果:
SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment') Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
可以發(fā)現(xiàn)返回結(jié)果是 SplitResult,其實(shí)也是一個(gè)元組類型,可以用屬性獲取值也可以用索引來獲取,實(shí)例如下:
from urllib.parse import urlsplit result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment') print(result.scheme, result[0])
運(yùn)行結(jié)果:
http http
與 urlunparse() 類似,也是將鏈接的各個(gè)部分組合成完整鏈接的方法,傳入的也是一個(gè)可迭代對(duì)象,例如列表、元組等等,唯一的區(qū)別是,長(zhǎng)度必須為 5。
用一個(gè)實(shí)例來感受一下:
from urllib.parse import urlunsplit data = ['http', 'www.baidu.com', 'index.html', 'a=6', 'comment'] print(urlunsplit(data))
運(yùn)行結(jié)果:
http://www.baidu.com/index.html?a=6#comment
同樣可以完成鏈接的拼接生成。
有了 urlunparse() 和 urlunsplit() 方法,我們可以完成鏈接的合并,不過前提必須要有特定長(zhǎng)度的對(duì)象,鏈接的每一部分都要清晰分開。
生成鏈接還有另一個(gè)方法,利用 urljoin() 方法我們可以提供一個(gè) base_url(基礎(chǔ)鏈接),新的鏈接作為第二個(gè)參數(shù),方法會(huì)分析 base_url 的 scheme、netloc、path 這三個(gè)內(nèi)容對(duì)新鏈接缺失的部分進(jìn)行補(bǔ)充,作為結(jié)果返回。
我們用幾個(gè)實(shí)例來感受一下:
from urllib.parse import urljoin print(urljoin('http://www.baidu.com', 'FAQ.html')) print(urljoin('http://www.baidu.com', 'https://cuiqingcai.com/FAQ.html')) print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html')) print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html?question=2')) print(urljoin('http://www.baidu.com?wd=abc', 'https://cuiqingcai.com/index.php')) print(urljoin('http://www.baidu.com', '?category=2#comment')) print(urljoin('www.baidu.com', '?category=2#comment')) print(urljoin('www.baidu.com#comment', '?category=2'))
運(yùn)行結(jié)果:
http://www.baidu.com/FAQ.html https://cuiqingcai.com/FAQ.html https://cuiqingcai.com/FAQ.html https://cuiqingcai.com/FAQ.html?question=2 https://cuiqingcai.com/index.php http://www.baidu.com?category=2#comment www.baidu.com?category=2#comment www.baidu.com?category=2
可以發(fā)現(xiàn),base_url 提供了三項(xiàng)內(nèi)容,scheme、netloc、path,如果這三項(xiàng)在新的鏈接里面不存在,那么就予以補(bǔ)充,如果新的鏈接存在,那么就使用新的鏈接的部分。base_url 中的 parameters、query、fragments 是不起作用的。
通過如上的函數(shù),我們可以輕松地實(shí)現(xiàn)鏈接的解析,拼合與生成。
我們?cè)俳榻B一個(gè)常用的 urlencode() 方法,它在構(gòu)造 GET 請(qǐng)求參數(shù)的時(shí)候非常有用,我們用實(shí)例感受一下:
from urllib.parse import urlencode params = { 'name': 'germey', 'age': 22 } base_url = 'http://www.baidu.com?' url = base_url + urlencode(params) print(url)
我們首先聲明了一個(gè)字典,將參數(shù)表示出來,然后調(diào)用 urlencode() 方法將其序列化為 URL 標(biāo)準(zhǔn) GET 請(qǐng)求參數(shù)。
運(yùn)行結(jié)果:
http://www.baidu.com?name=germey&age=22
可以看到參數(shù)就成功由字典類型轉(zhuǎn)化為 GET 請(qǐng)求參數(shù)了。
這個(gè)方法非常常用,有時(shí)為了更加方便地構(gòu)造參數(shù),我們會(huì)事先用字典來表示,要轉(zhuǎn)化為 URL 的參數(shù)時(shí)只需要調(diào)用該方法即可。
有了序列化必然就有反序列化,如果我們有一串 GET 請(qǐng)求參數(shù),我們利用 parse_qs() 方法就可以將它轉(zhuǎn)回字典,我們用一個(gè)實(shí)例感受一下:
from urllib.parse import parse_qs
query = 'name=germey&age=22'
print(parse_qs(query))
運(yùn)行結(jié)果:
{'name': ['germey'], 'age': ['22']}
可以看到這樣就成功轉(zhuǎn)回為字典類型了。
另外還有一個(gè) parse_qsl() 方法可以將參數(shù)轉(zhuǎn)化為元組組成的列表,實(shí)例如下:
from urllib.parse import parse_qsl query = 'name=germey&age=22' print(parse_qsl(query))
運(yùn)行結(jié)果:
[('name', 'germey'), ('age', '22')]
可以看到運(yùn)行結(jié)果是一個(gè)列表,列表的每一個(gè)元素都是一個(gè)元組,元組的第一個(gè)內(nèi)容是參數(shù)名,第二個(gè)內(nèi)容是參數(shù)值。
quote() 方法可以將內(nèi)容轉(zhuǎn)化為 URL 編碼的格式,有時(shí)候 URL 中帶有中文參數(shù)的時(shí)候可能導(dǎo)致亂碼的問題,所以我們可以用這個(gè)方法將中文字符轉(zhuǎn)化為 URL 編碼,實(shí)例如下:
from urllib.parse import quote keyword = '壁紙' url = 'https://www.baidu.com/s?wd=' + quote(keyword) print(url
在這里我們聲明了一個(gè)中文的搜索文字,然后用 quote() 方法對(duì)其進(jìn)行 URL 編碼,最后得到的結(jié)果如下:
https://www.baidu.com/s?wd=%E...
這樣我們就可以成功實(shí)現(xiàn)URL編碼的轉(zhuǎn)換。
有了 quote() 方法當(dāng)然還有 unquote() 方法,它可以進(jìn)行 URL 解碼,實(shí)例如下:
from urllib.parse import unquote url = 'https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8' print(unquote(url)) Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
這是上面得到的 URL 編碼后的結(jié)果,我們?cè)谶@里利用 unquote() 方法進(jìn)行還原,結(jié)果如下:
https://www.baidu.com/s?wd=壁紙
可以看到利用 unquote() 方法可以方便地實(shí)現(xiàn)解碼。
以上是“Python3中如何使用Urllib解析鏈接”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站標(biāo)題:Python3中如何使用Urllib解析鏈接
網(wǎng)站網(wǎng)址:http://www.rwnh.cn/article4/jdjjoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、網(wǎng)站營(yíng)銷、App設(shè)計(jì)、網(wǎng)站排名、ChatGPT、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)