文章目錄
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=壁紙