1. 程式人生 > >爬蟲urllib庫parse模組的urlparse詳解

爬蟲urllib庫parse模組的urlparse詳解

一 點睛

urllib庫裡還提供了parse這個模組,它定義了處理URL的標準介面,例如實現URL各部分的抽取、合併以及連結轉換。

它支援如下協議的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。

本篇詳細介紹urlparse()。

二 urlparse()詳解

1 程式碼1

from urllib.parse import urlparse
# 該方法可以實現URL的識別和分段
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
# 這裡我們利用urlparse()方法進行了一個URL的解析。首先,輸出瞭解析結果的型別,然後將結果也輸出出來。
print(type(result), result)

2 結果1

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_3.py
<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

3 說明1

可以看到,返回結果是一個ParseResult型別的物件,它包含6部分,分別是scheme、netloc、path、params、query和fragment。

觀察一下該例項的URL:http://www.baidu.com/index.html;user?id=5#comment

可以發現,urlparse()方法將其拆分成了6部分。

大體觀察可以發現,解析時有特定的分隔符。比如,://前面的就是scheme,代表協議;第一個/前面便是netloc,即域名;分號;後面是params,代表引數。

所以,可以得出一個標準的連結格式,具體如下:

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

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

4 urlparse()的API

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

可以看到,它有3個引數。

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

  • scheme:它是預設的協議(比如http或https等)。假如這個連結沒有帶協議資訊,會將這個作為預設的協議。

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

5 程式碼2

from urllib.parse import urlparse

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

6 結果2

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_3.py
ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='id=5', fragment='comment')

7 說明2 

提供的URL沒有包含最前面的scheme資訊,但是通過指定預設的scheme引數,返回的結果是https。

scheme引數只有在URL中不包含scheme資訊時才生效。如果URL中有scheme資訊,就會返回解析出的scheme。

8 程式碼3

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

9 結果3

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

10 說明3

scheme引數只有在URL中不包含scheme資訊時才生效。如果URL中有scheme資訊,就會返回解析出的scheme。

11 程式碼4

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

12 結果4

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_3.py
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5#comment', fragment='')

13 程式碼5

from urllib.parse import urlparse

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

14 結果5

E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_3.py
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#comment', params='', query='', fragment='')

15 說明5

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

16 程式碼6

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

17 結果6

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

18 說明6

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