爬蟲入門 -> urllib庫中parse模塊的基本使用(筆記三)

urllib庫中parse模塊的基本使用

urlparse方法

基本使用

  urlparse方法用於對URL的識別與分段:

#FILENAME:code6.py
import urllib.parse

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

result = urllib.parse.urlparse(url=URL)
print(type(result))
print(result)

運行結果如下:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code6.py
<class 'urllib.parse.ParseResult'>
ParseResult(scheme='https', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

從結果可知urlparse方法會返回一個ParseResult類型的對象,該對象由6部分組成:scheme(協議)、netloc(域名)、path(訪問路徑)、params(參數)、query(查詢條件)、fragment(錨點)


參數scheme

  urlparse方法的參數scheme表示協議。當url參數沒有包含協議時,將採用scheme作爲協議;若url包含了協議,則scheme不會產生任何影響。

#FILENAME:code6.py
import urllib.parse

URL = 'www.baidu.com/index.html;user?id=5#comment'

result = urllib.parse.urlparse(url=URL, scheme='http')
print(result)

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code6.py
ParseResult(scheme='http', netloc='', path='www.baidu.com/index.html', params='user', query='id=5', fragment='comment')

這裏需要注意,雖然協議採用了scheme,但是當url參數沒有協議時原來的域名將歸爲訪問路徑中。


參數allow_fragments

  該參數表示是否忽略fragments(錨點),若爲False則被忽略;若爲True則不忽略:

#FILENAME:code6.py
import urllib.parse

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

result = urllib.parse.urlparse(url=URL, scheme='http', allow_fragments=False)
print(result)

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code6.py
ParseResult(scheme='https', netloc='www.baidu.com', path='/index.html', params='user', query='id=5#comment', fragment='')

不忽略錨點是默認的,所以在基本使用中已經演示了,在上面是忽略了錨點的情況,可以發現雖然錨點爲空,但實際上原來的錨點被歸爲了查詢條件之中。


urlunparse方法

  urlunparse方法是urlparse方法的逆向操作:

#FILENAME:code7.py
import urllib.parse

data = ['https', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
result = urllib.parse.urlunparse(data)
print(type(result))
print(result)

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code7.py
<class 'str'>
https://www.baidu.com/index.html;user?a=6#comment



urlsplit方法與urlunsplit方法

  urlsplit方法同樣用於解析url,但它無法單獨解析params(參數),而是將其合併於path中:

#FILENAME:code8.py
import urllib.parse

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

result = urllib.parse.urlsplit(url)
print(type(result))
print(result)

結果如下:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code8.py
<class 'urllib.parse.SplitResult'>
SplitResult(scheme='https', netloc='www.baidu.com', path='/index.html;user', query='a=6', fragment='comment')

  與urlparse方法、urlunparse方法類似,urlunsplit方法是urlsplit方法的逆操作。


urljoin方法

  urljoin方法有兩個參數,一個爲base_url(基礎url),另一個爲url(當然還有第三個參數allow_fragments,前面講過它的含義)。

  base_url會提供協議、域名、路徑,如果url缺少三者中任意一個,base_url就會對url給予補充:

#FILENAME:code9.py

import urllib.parse
print(urllib.parse.urljoin('https://www.baidu.com', 'FAQ.html'))
print(urllib.parse.urljoin('https://www.baidu.com', 'http://cuiqingcai.com/FAQ.html'))
print(urllib.parse.urljoin('https://www.baidu.com/about.html', 'http://cuiqingcai.com/FAQ.html'))
print(urllib.parse.urljoin('https://www.baidu.com?wd=abc', 'FAQ.html'))

結果如下:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code9.py
https://www.baidu.com/FAQ.html
http://cuiqingcai.com/FAQ.html
http://cuiqingcai.com/FAQ.html
https://www.baidu.com/FAQ.html



urlencode方法

  urlencode方法常用於POST方式請求中,它可以將字典轉化爲合適的字符串:

#FILENAME:code10.py
import urllib.parse
Data_text = {
    'hello': 'world',
    'A': 'B'
}
result = urllib.parse.urlencode(Data_text)
print(result)
結果:
```shell
mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code10.py
hello=world&A=B

  具體的使用方法:

#FILENAME:code10.py
import urllib.parse
import urllib.request

url = 'http://httpbin.org/post'
Data_text = {
    'hello': 'world',
    'A': 'B'
}
Data = bytes(urllib.parse.urlencode(Data_text), 'utf-8')

response = urllib.request.urlopen(url=url, data=Data)
print(response.read().decode('utf-8'))

結果:
在這裏插入圖片描述


parse_qs方法

  parse_qs方法相當於urlencode方法的逆操作:

#FILENAME:code10.py
import urllib.parse

datastring = 'hello=world&A=B'
result = urllib.parse.parse_qs(datastring)
print(result)

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code10.py
{'hello': ['world'], 'A': ['B']}

注意轉換過後,每個字段的值都是一個列表。


parse_sql方法

  parse_sql方法與parse_sq方法相似,但parse_sql方法用於將字符串轉化爲由元組組成的列表:

#FILENAME:code10.py
import urllib.parse

datastring = 'hello=world&A=B'
result = urllib.parse.parse_qsl(datastring)
print(result)

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code10.py
[('hello', 'world'), ('A', 'B')]



quote方法與unquote方法

  quote方法與unquote方法是一對逆操作。當URL中帶有中文時可能會導致亂碼問題,此時使用quote方法可以將中文字符轉化爲URL編碼:

#FILENAME:code11.py
import urllib.parse

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

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code11.py
https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8

  關於unquote方法的使用:

#FILENAME:code11.py
import urllib.parse


url = 'https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8'
keyword = urllib.parse.urlparse(url=url).query
print(urllib.parse.unquote(keyword))

結果:

mine@virjid-ubuntu:~/Code/Sprider/18-10-11$ python ./code11.py
wd=壁紙
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章