Python如何實(shí)現(xiàn)轉(zhuǎn)換URL詳解
設(shè)計(jì)一個(gè)算法,將URL轉(zhuǎn)換成5部分,分別是:schema、netloc、path、query_params、fragment。
問(wèn)題
URL的中文名叫統(tǒng)一資源定位符,就是咱們常說(shuō)的網(wǎng)址,設(shè)計(jì)一個(gè)算法,將URL轉(zhuǎn)換成5部分,分別是:schema、netloc、path、query_params、fragment。
<scheme>://<netloc>/<path>?<query_params>#<fragment>
一圖勝千言:

應(yīng)用場(chǎng)景
在實(shí)際應(yīng)用場(chǎng)景中,有些聚合網(wǎng)站會(huì)把URL里面netloc提取出來(lái)。

分析
這里沒(méi)有什么特別復(fù)雜的算法,因?yàn)槊坎糠侄加幸粋€(gè)特別的字符,所以,如果你熟練Python的字符串操作和正則表達(dá)式使用的話那么就很簡(jiǎn)單。
知識(shí)點(diǎn)
字符串的常用方法split、find、join、lower、切片的使用,re模塊下面的常用方法。另外還有關(guān)于如何使用 namedtuple 定義一個(gè)簡(jiǎn)單類的操作
實(shí)現(xiàn)
第一種方式使用字符串提供的方法,就是根據(jù)關(guān)鍵字符進(jìn)行切分。整體思路是利用字符串的切片功能不斷進(jìn)行切分,代碼稍顯復(fù)雜。
URL = namedtuple("URL", ["schema", "netloc", "path", "params", "fragment"])
def url_parse1(url):
assert url.startswith("http")
# 初始化每部分為空
schema = netloc = params = fragment = path = None
# 從 :// 切分 url,前面部分是shema
i = url.find('://')
if i > 0:
schema = url[:i]
url = url[i + 3:]
# 獲取netloc
for c in "/?#": # 三個(gè)分隔符的順利很重要
a = url.find(c)
if a > 0: # 只要有三個(gè)字符中的任意字符,立即切分,前部分就是netloc,剩下的部分進(jìn)行后續(xù)處理
netloc, url = url[0:a], url[a:]
break
else:
netloc, url = url, '' # 如果三個(gè)分隔符都不在url中,那么這是一個(gè)只包含
# 同樣的方式獲取path
for c in "?#":
a = url.find(c)
if a > 0:
path, url = url[0:a], url[a:]
break
else:
path, url = url or None, ''
if "#" in url:
url, fragment = url.split("#", 1)
if '?' in url:
url, params = url.split('?', 1)
return URL(schema=schema, netloc=netloc, path=path, params=_params_parse(params), fragment=fragment)
def _params_parse(params):
if not params:
return None
pairs = [s for s in params.split('&')]
param_dict = dict()
for pair in pairs:
k, v = pair.split('=', 1)
param_dict[k] = v
return param_dict
第二種方式就是用正則表達(dá)式,主要考驗(yàn)?zāi)銓?xiě)正則的能力
def url_parse2(url): rex = r'^(http[s]?):\/\/([^\/\s]+)([\/\w\-\.]+[^#?\s]*)?(\?([^#]*))?(#(.*))?$' schema = netloc = params = fragment = path = '' pattern = re.compile(rex) match = pattern.match(url) if match: schema = match.group(1) netloc = match.group(2) path = match.group(3) params = match.group(5) fragment = match.group(7) return URL(schema=schema, netloc=netloc, path=path, params=_params_parse(params), fragment=fragment)
通過(guò)正則表達(dá)式的分組功能提取每部分,關(guān)于正則表達(dá)式推薦兩個(gè)資源
Python中正則表達(dá)式介紹, 這是一篇比較完整介紹Python中正則表達(dá)式的文章,如果你能讀懂里面的每句話,并且實(shí)踐后,你一定能寫(xiě)出上面這樣的表達(dá)式出來(lái)。
當(dāng)然,你也可以直接使用urlparse模塊中現(xiàn)成的方式來(lái)實(shí)現(xiàn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的示例
本篇文章主要分享python學(xué)生管理系統(tǒng)的使用,文章非常詳細(xì)地介紹了通過(guò)示例代碼實(shí)現(xiàn)的學(xué)生管理系統(tǒng),該系統(tǒng)對(duì)每個(gè)人的研究或工作都有一定的參考學(xué)習(xí)價(jià)值,希望你能在其中有所收獲。2020-11-11
Python中values()函數(shù)用法簡(jiǎn)單示例
這篇文章主要給大家介紹了關(guān)于Python中values()函數(shù)用法的相關(guān)資料,python內(nèi)置的values()函數(shù)返回一個(gè)字典中所有的值,文中給出了代碼示例,需要的朋友可以參考下2023-09-09
Python和Excel的完美結(jié)合的常用操作案例匯總
這篇文章主要介紹了Python和Excel的完美結(jié)合的常用操作案例匯總,文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
利用Python將list列表寫(xiě)入文件并讀取的方法匯總
因?yàn)閷?shí)驗(yàn)需要,實(shí)現(xiàn)了一下寫(xiě)入txt文件,下面這篇文章主要給大家介紹了關(guān)于如何利用Python將list列表寫(xiě)入文件并讀取的幾種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Python機(jī)器學(xué)習(xí)之手寫(xiě)KNN算法預(yù)測(cè)城市空氣質(zhì)量
KNN(K-Nearest Neighbor)最鄰近分類算法是數(shù)據(jù)挖掘分類(classification)技術(shù)中常用算法之一,本文將介紹如何通過(guò)KNN算法實(shí)現(xiàn)城市空氣質(zhì)量的預(yù)測(cè),感興趣的同學(xué)可以了解一下2021-12-12
Python3如何實(shí)現(xiàn)列表模糊匹配列表
這篇文章主要介紹了Python3如何實(shí)現(xiàn)列表模糊匹配列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
pycharm下載包的時(shí)候出現(xiàn) no information available的解決
這篇文章主要介紹了pycharm下載包的時(shí)候出現(xiàn) no information available的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
python基于三階貝塞爾曲線的數(shù)據(jù)平滑算法
這篇文章主要介紹了python基于三階貝塞爾曲線的數(shù)據(jù)平滑算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

