- 首頁|
- 網(wǎng)校|
- 焚題庫|
- APP |
-
微信公眾號(hào)
,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、 sip、sips、snews、svn、svn+ssh、telnet和wais。本節(jié)中,我們介紹一下該模塊中常用的方法來看一下它的便捷之處。
1. 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é)果如下:
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5',
fragment='comment')
可以看到,返回結(jié)果是一個(gè)ParseResult類型的對(duì)象,它包含6部分,分別是scheme、netloc、path、params、query和fragment。
觀察一下該實(shí)例的URL:
http://www.baidu.com/index.html;user?id=5#comment
可以發(fā)現(xiàn),urlparse()方法將其拆分成了6部分。大體觀察可以發(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()方法可以將它拆分開來。
除了這種最基本的解析方式外,urlparse()方法還有其他配置嗎?接下來,看一下它的API用法:
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
可以看到,它有3個(gè)參數(shù)。
urlstring:這是必填項(xiàng),即待解析的URL。
scheme:它是默認(rèn)的協(xié)議(比如http或https等)。假如這個(gè)鏈接沒有帶協(xié)議信息,會(huì)將這個(gè)作為默認(rèn)的協(xié)議。我們用實(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í)才生效。如果URL中有scheme信息,就會(huì)返回解析出的scheme。
allow_fragments:即是否忽略fragment。如果它被設(shè)置為False,fragment部分就會(huì)被忽略,它會(huì)被解析為path、parameters或者query的一部分,而fragment部分為空。下面我們用實(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中不包含params和query,我們?cè)偻ㄟ^實(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è)元組,我們可以用索引順序來獲取,也可以用屬性名獲取。示例如下:
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é)果是一致的,兩種方法都可以成功獲取。
2. urlunparse()
有了urlparse(),相應(yīng)地就有了它的對(duì)立方法urlunparse()。它接受的參數(shù)是一個(gè)可迭代對(duì)象,但是它的長度必須是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)造。
3. urlsplit()
這個(gè)方法和urlparse()方法非常相似,只不過它不再單獨(dú)解析params這一部分,只返回5個(gè)結(jié)果。上面例子中的params會(huì)合并到path中。示例如下:
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')
可以發(fā)現(xiàn),返回結(jié)果是SplitResult,它其實(shí)也是一個(gè)元組類型,既可以用屬性獲取值,也可以用索引來獲取。示例如下:
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
4. urlunsplit()
與urlunparse()類似,它也是將鏈接各個(gè)部分組合成完整鏈接的方法,傳入的參數(shù)也是一個(gè)可迭代對(duì)象,例如列表、元組等,唯一的區(qū)別是長度必須為5。示例如下:
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
5. urljoin()
有了urlunparse()和urlunsplit()方法,我們可以完成鏈接的合并,不過前提必須要有特定長度的對(duì)象,鏈接的每一部分都要清晰分開。
此外,生成鏈接還有另一個(gè)方法,那就是urljoin()方法。我們可以提供一個(gè)base_url(基礎(chǔ)鏈接)作為第一個(gè)參數(shù),將新的鏈接作為第二個(gè)參數(shù),該方法會(huì)分析base_url的scheme、netloc和path這3個(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。如果這3項(xiàng)在新的鏈接里不存在,就予以補(bǔ)充;如果新的鏈接存在,就使用新的鏈接的部分。而base_url中的params、query和fragment是不起作用的。
通過urljoin()方法,我們可以輕 松實(shí)現(xiàn)鏈接的解析、拼合與生成。
6. urlencode()
這里我們?cè)俳榻B一個(gè)常用的方法——urlencode(),它在構(gòu)造GET請(qǐng)求參數(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()方法將其序列化為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)用該方法即可。
7. parse_qs()
有了序列化,必 然就有反序列化。如果我們有一串GET請(qǐng)求參數(shù),利用parse_qs()方法,就可以將它轉(zhuǎn)回字典,示例如下:
from urllib.parse import parse_qs
query = 'name=germey&age=22'
print(parse_qs(query))
運(yùn)行結(jié)果如下:
{'name': ['germey'], 'age': ['22']}
可以看到,這樣就成功轉(zhuǎn)回為字典類型了。
8. parse_qsl()
另外,還有一個(gè)parse_qsl()方法,它用于將參數(shù)轉(zhuǎn)化為元組組成的列表,示例如下:
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ù)值。
9. quote()
該方法可以將內(nèi)容轉(zhuǎn)化為URL編碼的格式。URL中帶有中文參數(shù)時(shí),有時(shí)可能會(huì)導(dǎo)致亂碼的問題,此時(shí)用這個(gè)方法可以將中文字符轉(zhuǎn)化為URL編碼,示例如下:
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=å£çº¸
10. unquote()
有了quote()方法,當(dāng)然還有unquote()方法,它可以進(jìn)行URL解碼,示例如下:
from urllib.parse import unquote
url = 'https://www.baidu.com/s?wd=å£çº¸'
print(unquote(url))
這是上面得到的URL編碼后的結(jié)果,這里利用unquote()方法還原,結(jié)果如下:
https://www.baidu.com/s?wd=壁紙
可以看到,利用unquote()方法可以方便地實(shí)現(xiàn)解碼。
如今python編程語言市場(chǎng)需求大,薪資待遇上萬盡在咫尺!如果你也想學(xué)習(xí)python技術(shù)可以填寫下面表單,Python學(xué)習(xí)資料限時(shí)免費(fèi)領(lǐng)取!
上一篇:關(guān)于requests模塊的安裝及使用方法,看你能懂多少
下一篇: 沒有了
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊(cè)會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評(píng)估師國際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測(cè)工程師建筑八大員注冊(cè)建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評(píng)價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論