爬蟲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實際上是一個元組,我們可以用索引順序來獲取,也可以用屬性名獲取。