成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Python的urlliib.parse庫解析URL

開發 后端
Python 中的 urllib.parse 模塊提供了很多解析和組建 URL 的函數。urlparse() 函數可以將 URL 解析成 ParseResult 對象。

使用Python的urlliib.parse庫解析URL

Python 中的 urllib.parse 模塊提供了很多解析和組建 URL 的函數。 

解析url

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

  • 協議(scheme)
  • 域名(netloc)
  • 路徑(path)
  • 路徑參數(params)
  • 查詢參數(query)
  • 片段(fragment)
  1. from urllib.parse import urlparse
  2.  
  3. url='http://user:pwd@domain:80/path;params?query=queryarg#fragment'
  4.  
  5. parsed_result=urlparse(url)
  6.  
  7. print('parsed_result 包含了',len(parsed_result),'個元素')
  8. print(parsed_result)

結果為:

  1. parsed_result 包含了 6 個元素
  2. 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 進一步進行拆分。

  1. print('scheme :', parsed_result.scheme)
  2. print('netloc :', parsed_result.netloc)
  3. print('path :', parsed_result.path)
  4. print('params :', parsed_result.params)
  5. print('query :', parsed_result.query)
  6. print('fragment:', parsed_result.fragment)
  7. print('username:', parsed_result.username)
  8. print('password:', parsed_result.password)
  9. print('hostname:', parsed_result.hostname)
  10. print('port :', parsed_result.port)

結果為:

  1. scheme : http
  2. netloc : user:pwd@domain:80
  3. path : /path
  4. params : params
  5. query : query=queryarg
  6. fragment: fragment
  7. username: user
  8. password: pwd
  9. hostname: domain
  10. port : 80

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

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

  1. url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'
  2.  
  3. parsed_result=urlparse(url)
  4.  
  5. print(parsed_result)
  6. print('parsed.path :', parsed_result.path)
  7. print('parsed.params :', parsed_result.params)

結果為:

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

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

  1. from urllib.parse import urlsplit
  2. split_result=urlsplit(url)
  3.  
  4. print(split_result)
  5. print('split.path :', split_result.path)
  6. # SplitResult 沒有 params 屬性

結果為:

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

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

  1. from urllib.parse import urldefrag
  2.  
  3. url = 'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'
  4.  
  5. d = urldefrag(url)
  6. print(d)
  7. print('url :', d.url)
  8. print('fragment:', d.fragment)

結果為:

  1. DefragResult(url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg', fragment='fragment')
  2. url : http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg
  3. fragment: fragment 

組建URL

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

  1. print(parsed_result.geturl())
  2. print(split_result.geturl())

結果為:

  1. http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
  2. http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment

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

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

結果為:

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

相對路徑轉換絕對路徑

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

  1. from urllib.parse import urljoin
  2.  
  3. print(urljoin('http://www.example.com/path/file.html', 'anotherfile.html'))
  4. print(urljoin('http://www.example.com/path/', 'anotherfile.html'))
  5. print(urljoin('http://www.example.com/path/file.html', '../anotherfile.html'))
  6. print(urljoin('http://www.example.com/path/file.html', '/anotherfile.html'))

結果為:

  1. http://www.example.com/path/anotherfile.html
  2. http://www.example.com/path/anotherfile.html
  3. http://www.example.com/anotherfile.html
  4. http://www.example.com/anotherfile.html 

查詢參數的構造和解析

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

  1. from urllib.parse import urlencode
  2.  
  3. query_args = {
  4. 'name': 'dark sun',
  5. 'country': '中國'
  6. }
  7.  
  8. query_args = urlencode(query_args)
  9. print(query_args)

結果為:

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

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

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

  1. from urllib.parse import parse_qs
  2. print(parse_qs(query_args))

結果為:

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

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

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

結果為:

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

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

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

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

結果為:

  1. http://localhost:1080/~hello!/
  2. http://localhost:1080/~hello!/

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

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2019-02-26 13:00:11

JavaScriptURL前端

2021-08-11 22:50:53

JavaScript編程開發

2022-11-08 11:49:09

NLP庫Python云服務

2009-12-10 16:04:56

PHP函數parse_

2019-07-25 09:15:36

Python參數命令

2023-05-09 08:18:07

Python開發技巧

2022-05-11 12:12:32

ScapyPython網絡包

2022-02-11 19:08:07

JavaScriptURLurlcat

2024-01-02 08:43:48

qs工具庫格式化

2011-08-18 13:37:57

iPhone項目靜態庫

2010-03-15 10:49:57

Python函數變量

2021-07-05 12:09:58

Python編程語言

2014-03-13 13:44:37

BoltsParse底層庫

2024-05-15 09:05:43

Python文檔處理工具自動化文檔生成

2021-11-23 09:09:27

Applicationandroid系統開發

2021-11-19 17:26:11

AppApplication方法

2013-10-31 10:59:41

Clouda使用

2010-08-11 13:28:46

Flex行為

2022-01-13 11:41:55

URLDoSRCE

2021-01-12 05:03:15

PythonLxmlXpath
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰人人插 | 国产在线观看网站 | 欧美日日| 成人午夜精品 | 国产九九精品视频 | 国产成人综合一区二区三区 | 欧美日韩不卡 | 免费精品 | 小早川怜子xxxxaⅴ在线 | 性色的免费视频 | 久久久噜噜噜久久中文字幕色伊伊 | 免费看欧美一级片 | 91免费看片 | 亚洲国产精品99久久久久久久久 | 黄色91在线 | 国产精品三级 | 久久se精品一区精品二区 | 人人干97| 国产在线精品一区二区三区 | 欧美精品久久久久久久久老牛影院 | 乱码av午夜噜噜噜噜动漫 | 日日操天天射 | 亚洲精品电影 | 精品国产18久久久久久二百 | 欧美一级二级视频 | 一区视频 | 日韩综合一区 | 久热精品在线观看视频 | 国产一区二区欧美 | 国产欧美精品一区二区三区 | 久久国产精品久久国产精品 | 四虎午夜剧场 | 欧美精品一区二区三区在线播放 | 中文字幕免费视频 | 欧美日韩高清一区 | 国产日韩欧美一区 | 久色激情 | 久久噜 | 日本特黄特色aaa大片免费 | 影音先锋久久 | 亚洲精品影院 |