中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何利用urlliib.parse庫解析URL

發布時間:2022-06-01 14:37:23 來源:億速云 閱讀:182 作者:iii 欄目:大數據

這篇“Python如何利用urlliib.parse庫解析URL”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python如何利用urlliib.parse庫解析URL”文章吧。

解析url

urlparse() 函數可以將 URL 解析成 ParseResult 對象。對象中包含了六個元素,分別為:

  • 協議(scheme)

  • 域名(netloc)

  • 路徑(path)

  • 路徑參數(params)

  • 查詢參數(query)

  • 片段(fragment)

from urllib.parse import urlparse url='http://user:pwd@domain:80/path;params?query=queryarg#fragment' parsed_result=urlparse(url) print('parsed_result 包含了',len(parsed_result),'個元素')print(parsed_result)

結果為:

parsed_result 包含了 6 個元素ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path', params='params', query='query=queryarg', fragment='fragment')

ParseResult 繼承于 namedtuple,因此可以同時通過索引和命名屬性來獲取 URL 中各部分的值。

為了方便起見, ParseResult 還提供了 username、 password、 hostname、 port 對 netloc 進一步進行拆分。

print('scheme  :', parsed_result.scheme)print('netloc  :', parsed_result.netloc)print('path    :', parsed_result.path)print('params  :', parsed_result.params)print('query   :', parsed_result.query)print('fragment:', parsed_result.fragment)print('username:', parsed_result.username)print('password:', parsed_result.password)print('hostname:', parsed_result.hostname)print('port    :', parsed_result.port)

結果為:

scheme  : httpnetloc  : user:pwd@domain:80path    : /pathparams  : paramsquery   : query=queryargfragment: fragmentusername: userpassword: pwdhostname: domainport    : 80

除了 urlparse() 之外,還有一個類似的 urlsplit() 函數也能對 URL 進行拆分,所不同的是, urlsplit() 并不會把 路徑參數(params) 從 路徑(path) 中分離出來。

當 URL 中路徑部分包含多個參數時,使用 urlparse() 解析是有問題的:

url='http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment' parsed_result=urlparse(url) print(parsed_result)print('parsed.path    :', parsed_result.path)print('parsed.params  :', parsed_result.params)

結果為:

ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path2;params1/path3', params='params2', query='query=queryarg', fragment='fragment')parsed.path    : /path2;params1/path3parsed.params  : params2

這時可以使用 urlsplit() 來解析:

from urllib.parse import urlsplitsplit_result=urlsplit(url) print(split_result)print('split.path    :', split_result.path)# SplitResult 沒有 params 屬性

結果為:

SplitResult(scheme='http', netloc='user:pwd@domain:80', path='/path2;params1/path3;params2', query='query=queryarg', fragment='fragment')split.path    : /path2;params1/path3;params2

若只是要將 URL 后的 fragment 標識拆分出來,可以使用 urldefrag() 函數:

from urllib.parse import urldefrag url = 'http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment' d = urldefrag(url)print(d)print('url     :', d.url)print('fragment:', d.fragment)

結果為:

DefragResult(url='http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg', fragment='fragment')url     : http://user:pwd@domain:80/path2;params1/path3;params2?query=queryargfragment: fragment

組建URL

ParsedResult 對象和 SplitResult 對象都有一個 geturl() 方法,可以返回一個完整的 URL 字符串。

print(parsed_result.geturl())print(split_result.geturl())

結果為:

http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragmenthttp://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment

但是 geturl() 只在 ParsedResult 和 SplitResult 對象中有,若想將一個普通的元組組成 URL,則需要使用 urlunparse() 函數:

from urllib.parse import urlunparseurl_compos = ('http', 'user:pwd@domain:80', '/path2;params1/path3', 'params2', 'query=queryarg', 'fragment')print(urlunparse(url_compos))

結果為:

http://user:pwd@domain:80/path2;params1/path3;params2?query=queryarg#fragment

相對路徑轉換絕對路徑

除此之外,urllib.parse 還提供了一個 urljoin() 函數,來將相對路徑轉換成絕對路徑的 URL。

from urllib.parse import urljoin print(urljoin('http://www.example.com/path/file.html', 'anotherfile.html'))print(urljoin('http://www.example.com/path/', 'anotherfile.html'))print(urljoin('http://www.example.com/path/file.html', '../anotherfile.html'))print(urljoin('http://www.example.com/path/file.html', '/anotherfile.html'))

結果為:

http://www.example.com/path/anotherfile.htmlhttp://www.example.com/path/anotherfile.htmlhttp://www.example.com/anotherfile.htmlhttp://www.example.com/anotherfile.html

查詢參數的構造和解析

使用 urlencode() 函數可以將一個 dict 轉換成合法的查詢參數:

from urllib.parse import urlencode query_args = {    'name': 'dark sun',    'country': '中國'} query_args = urlencode(query_args)print(query_args)

結果為:

name=dark+sun&country=%E4%B8%AD%E5%9B%BD

可以看到特殊字符也被正確地轉義了。

相對的,可以使用 parse_qs() 來將查詢參數解析成 dict。

from urllib.parse import parse_qsprint(parse_qs(query_args))

結果為:

{'name': ['dark sun'], 'country': ['中國']}

如果只是希望對特殊字符進行轉義,那么可以使用 quote 或 quote_plus 函數,其中 quote_plus 比 quote 更激進一些,會把 :/ 一類的符號也給轉義了。

from urllib.parse import quote, quote_plus, urlencode url = 'http://localhost:1080/~hello!/'print('urlencode :', urlencode({'url': url}))print('quote     :', quote(url))print('quote_plus:', quote_plus(url))

結果為:

urlencode : url=http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2Fquote     : http%3A//localhost%3A1080/%7Ehello%21/quote_plus: http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F

可以看到 urlencode 中應該是調用 quote_plus 來進行轉義的。

逆向操作則使用 unquote 或 unquote_plus 函數:

from urllib.parse import unquote, unquote_plus encoded_url = 'http%3A%2F%2Flocalhost%3A1080%2F%7Ehello%21%2F'print(unquote(encoded_url))print(unquote_plus(encoded_url))

結果為:

http://localhost:1080/~hello!/http://localhost:1080/~hello!/

你會發現 unquote 函數居然能正確地將 quote_plus 的結果轉換回來。

以上就是關于“Python如何利用urlliib.parse庫解析URL”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海晏县| 英德市| 建水县| 安义县| 新丰县| 五河县| 深州市| 昌宁县| 中江县| 邢台市| 铁力市| 吴江市| 伊川县| 井陉县| 西乌珠穆沁旗| 台湾省| 长春市| 柘城县| 原阳县| 湘潭县| 鹿泉市| 夏河县| 泾阳县| 和龙市| 万荣县| 呼图壁县| 兴仁县| 额敏县| 临泽县| 贵阳市| 青田县| 都昌县| 石狮市| 西华县| 杨浦区| 海盐县| 绥德县| 葫芦岛市| 阿坝县| 阜新市| 纳雍县|