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

溫馨提示×

溫馨提示×

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

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

Python3中如何使用Urllib解析鏈接

發布時間:2021-10-18 13:46:27 來源:億速云 閱讀:168 作者:小新 欄目:編程語言

小編給大家分享一下Python3中如何使用Urllib解析鏈接,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Urllib 庫里還提供了 parse 這個模塊,它定義了處理 URL 的標準接口,例如實現 URL 各部分的抽取,合并以及鏈接轉換。它支持如下協議的 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。

1. urlparse()

urlparse() 方法可以實現 URL 的識別和分段,我們先用一個實例來感受一下:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result)

在這里我們利用了 urlparse() 方法進行了一個 URL 的解析,首先輸出了解析結果的類型,然后將結果也輸出出來。

運行結果:

<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

觀察可以看到,返回結果是一個 ParseResult 類型的對象,它包含了六個部分,分別是 scheme、netloc、path、params、query、fragment。

觀察一下實例的URL:

http://www.baidu.com/index.html;user?id=5#comment

urlparse() 方法將其拆分成了六部分,大體觀察可以發現,解析時有特定的分隔符,比如 :// 前面的就是 scheme,代表協議,第一個 / 前面便是 netloc,即域名,分號 ; 前面是 params,代表參數。

所以可以得出一個標準的鏈接格式如下:

scheme://netloc/path;parameters?query#fragment

一個標準的 URL 都會符合這個規則,利用 urlparse() 方法我們可以將它解析拆分開來。

除了這種最基本的解析方式,urlopen() 方法還有其他配置嗎?接下來看一下它的 API 用法:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

可以看到它有三個參數:

  • urlstring,是必填項,即待解析的 URL。

  • scheme,是默認的協議(比如http、https等),假如這個鏈接沒有帶協議信息,會將這個作為默認的協議。

我們用一個實例感受一下:

from urllib.parse import urlparse

result = urlparse('www.baidu.com/index.html;user?id=5#comment', scheme='https')
print(result)

運行結果:

ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='id=5', fragment='comment')

可以發現,我們提供的 URL 沒有包含最前面的 scheme 信息,但是通過指定默認的 scheme 參數,返回的結果是 https。

假設我們帶上了 scheme 呢?

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment', scheme='https')

結果如下:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

可見 scheme 參數只有在 URL 中不包含 scheme 信息時才會生效,如果 URL 中有 scheme 信息,那就返回解析出的 scheme。

  • allow_fragments,即是否忽略 fragment,如果它被設置為 False,fragment 部分就會被忽略,它會被解析為 path、parameters 或者 query 的一部分,fragment 部分為空。

下面我們用一個實例感受一下:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html;user?id=5#comment', allow_fragments=False)
print(result)

運行結果:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5#comment', fragment='')

假設 URL 中不包含 parameters 和 query 呢?

再來一個實例看下:

from urllib.parse import urlparse

result = urlparse('http://www.baidu.com/index.html#comment', allow_fragments=False)
print(result)

運行結果:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#comment', params='', query='', fragment='')

可以發現當 URL 中不包含 params 和 query 時, fragment 便會被解析為 path 的一部分。

返回結果 ParseResult 實際上是一個元組,我們可以用索引順序來獲取,也可以用屬性名稱獲取,實例如下:

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,運行結果如下:

http
http
www.baidu.com
www.baidu.com

可以發現二者結果是一致的,兩種方法都可以成功獲取。

2. urlunparse()

有了 urlparse() 那相應地就有了它的對立方法 urlunparse()。

它接受的參數是一個可迭代對象,但是它的長度必須是 6,否則會拋出參數數量不足或者過多的問題。

先用一個實例感受一下:

from urllib.parse import urlunparse

data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
print(urlunparse(data))

參數 data 用了列表類型,當然你也可以用其他的類型如元組或者特定的數據結構。

運行結果如下:

http://www.baidu.com/index.html;user?a=6#comment

這樣我們就成功實現了 URL 的構造。

3. urlsplit()

這個和 urlparse() 方法非常相似,只不過它不會單獨解析 parameters 這一部分,只返回五個結果。上面例子中的 parameters 會合并到 path中,用一個實例感受一下:

from urllib.parse import urlsplit

result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)

運行結果:

SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

可以發現返回結果是 SplitResult,其實也是一個元組類型,可以用屬性獲取值也可以用索引來獲取,實例如下:

from urllib.parse import urlsplit

result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result.scheme, result[0])

運行結果:

http http

4. urlunsplit()

與 urlunparse() 類似,也是將鏈接的各個部分組合成完整鏈接的方法,傳入的也是一個可迭代對象,例如列表、元組等等,唯一的區別是,長度必須為 5。

用一個實例來感受一下:

from urllib.parse import urlunsplit

data = ['http', 'www.baidu.com', 'index.html', 'a=6', 'comment']
print(urlunsplit(data))

運行結果:

http://www.baidu.com/index.html?a=6#comment

同樣可以完成鏈接的拼接生成。

5. urljoin()

有了 urlunparse() 和 urlunsplit() 方法,我們可以完成鏈接的合并,不過前提必須要有特定長度的對象,鏈接的每一部分都要清晰分開。

生成鏈接還有另一個方法,利用 urljoin() 方法我們可以提供一個 base_url(基礎鏈接),新的鏈接作為第二個參數,方法會分析 base_url 的 scheme、netloc、path 這三個內容對新鏈接缺失的部分進行補充,作為結果返回。

我們用幾個實例來感受一下:

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'))

運行結果:

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

可以發現,base_url 提供了三項內容,scheme、netloc、path,如果這三項在新的鏈接里面不存在,那么就予以補充,如果新的鏈接存在,那么就使用新的鏈接的部分。base_url 中的 parameters、query、fragments 是不起作用的。

通過如上的函數,我們可以輕松地實現鏈接的解析,拼合與生成。

6. urlencode()

我們再介紹一個常用的 urlencode() 方法,它在構造 GET 請求參數的時候非常有用,我們用實例感受一下:

from urllib.parse import urlencode

params = {
    'name': 'germey',
    'age': 22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)

我們首先聲明了一個字典,將參數表示出來,然后調用 urlencode() 方法將其序列化為 URL 標準 GET 請求參數。

運行結果:

http://www.baidu.com?name=germey&age=22

可以看到參數就成功由字典類型轉化為 GET 請求參數了。

這個方法非常常用,有時為了更加方便地構造參數,我們會事先用字典來表示,要轉化為 URL 的參數時只需要調用該方法即可。

7. parse_qs()

有了序列化必然就有反序列化,如果我們有一串 GET 請求參數,我們利用 parse_qs() 方法就可以將它轉回字典,我們用一個實例感受一下:

from urllib.parse import parse_qs

query = 'name=germey&age=22'
print(parse_qs(query))

運行結果:

{'name': ['germey'], 'age': ['22']}

可以看到這樣就成功轉回為字典類型了。

8. parse_qsl()

另外還有一個 parse_qsl() 方法可以將參數轉化為元組組成的列表,實例如下:

from urllib.parse import parse_qsl

query = 'name=germey&age=22'
print(parse_qsl(query))

運行結果:

[('name', 'germey'), ('age', '22')]

可以看到運行結果是一個列表,列表的每一個元素都是一個元組,元組的第一個內容是參數名,第二個內容是參數值。

9. quote()

quote() 方法可以將內容轉化為 URL 編碼的格式,有時候 URL 中帶有中文參數的時候可能導致亂碼的問題,所以我們可以用這個方法將中文字符轉化為 URL 編碼,實例如下:

from urllib.parse import quote

keyword = '壁紙'
url = 'https://www.baidu.com/s?wd=' + quote(keyword)
print(url

在這里我們聲明了一個中文的搜索文字,然后用 quote() 方法對其進行 URL 編碼,最后得到的結果如下:

https://www.baidu.com/s?wd=%E...

這樣我們就可以成功實現URL編碼的轉換。

10. unquote()

有了 quote() 方法當然還有 unquote() 方法,它可以進行 URL 解碼,實例如下:

from urllib.parse import unquote

url = 'https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8'
print(unquote(url))
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這里是Python學習者的聚集地,零基礎,進階,都歡迎

這是上面得到的 URL 編碼后的結果,我們在這里利用 unquote() 方法進行還原,結果如下:

https://www.baidu.com/s?wd=壁紙

可以看到利用 unquote() 方法可以方便地實現解碼。

以上是“Python3中如何使用Urllib解析鏈接”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

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

AI

汕尾市| 广德县| 徐州市| 乐东| 普宁市| 桂平市| 陇南市| 乳源| 贡嘎县| 云阳县| 平原县| 新河县| 自贡市| 黎平县| 兰州市| 濮阳县| 监利县| 禄丰县| 贞丰县| 葵青区| 皮山县| 邢台县| 肃北| 海原县| 娱乐| 金秀| 田东县| 邹平县| 孟村| 吉安县| 镇安县| 潮安县| 镇赉县| 沧州市| 屏山县| 抚松县| 水富县| 龙井市| 咸宁市| 西贡区| 博湖县|