一、url處理
python3中url處理包名稱爲urllib,其中主要功能模塊如下:
error模塊
parse模塊
request模塊
response模塊
robotparse模塊
1.1、url解析
舉例1:
from urllib.parse import urlparse
url="http://alice:[email protected]:80/%7Ealice/python.cgi?query=text#sample"
print(urlparse(url)) #調用urlparse模塊中的urlparse方法,其他主要方法還有urljoin,urlsplit和urlunsplit等。
結果如下:
ParseResult(scheme='http', netloc='alice:[email protected]:80', path='/%7Ealice/python.cgi', params='', query='query=text', fragment='sample')
說明:1’urlparse對於url定義是採用六元組,如下:
scheme://netloc/path;parameters?query#fragment。
>>> r.scheme
'http'
>>> r.netloc
'alice:[email protected]:80'
>>> r.path
'/%7Ealice/python.cgi'
>>> r.params
''
>>> r.query
'query=text'
>>> r.fragment
'sample'
>>> r.username
'alice'
>>> r.password
'secret'
>>> r.hostname
'www.hostname.com'
>>> r.port
80
>>> r.geturl()
'http://alice:[email protected]:80/%7Ealice/python.cgi?query=text#sample'
>>> r2=urlparse("www.pyton.or/about",'http')
>>> r2
ParseResult(scheme='http', netloc='', path='www.pyton.or/about', params='', query='', fragment='')
總結:
- 六元組中的每個值都是字符串,如果URL中不存在則爲空值。這裏網絡地址部分沒有進一步區分服務器地址和端口地址,而作爲一個字符串
- 解析URL時候,所有的%轉義符不會被處理。分隔符將會去掉,除了在路徑中的第一個起始斜線外。
- urlparse方法返回的對象中的屬性有scheme,netlocl,path,query(查詢部分),params(參數)。另外還有兩個可選參數,scheme和allow_fragments(指示是否可以對地址進行分片,默認值True)
1.2、url的拼合
>>> from urllib.parse import urljoin,urlsplit,urlunsplit #從模塊中直接引入方法 >>> r=urljoin("http://www.baidu.com","ice.html") #包含有絕對url和相對url >>> r 'http://www.baidu.com/ice.html'
說明:
>>> help(urljoin)
Help on function urljoin in module urllib.parse:
urljoin(base, url, allow_fragments=True)
Join a base URL and a possibly relative URL to form an absolute
interpretation of the latter.
注意:當相對URL中如果有協議字段的話,則優先使用相對URL,否則使用絕對URL中協議字段。如:
>>> r=urljoin('http://www.python.org','ftp://www.python.org/faq')
>>> r #採用了後面相對地址協議值
'ftp://www.python.org/faq'
>>> r=urljoin('http://www.python.org','www.python.org/faq')
>>> r #當相對地址字符串不含有協議的時候,會默認爲字符串
'http://www.python.org/www.python.org/faq'
>>>r=urljoin("http://www.python.org/faq","http://www.python.org/ask") #絕對url和相對url中都含有服務器地址且不相同,則採用相對url地址的服務器地址和路徑
>>> r****
'http://www.python.org/ask'
1.3、url分解
urlsplit和urlparse類似,同樣接受一個字符串,然後給出一個五元組。僅比urlparse方法少了param參數,從而由六元組變成五元組。
>>> from urllib.parse import urlsplit
>>> urlsplit("http://www.python.org:80/faq.cgi?src=file")
SplitResult(scheme='http', netloc='www.python.org:80', path='/faq.cgi', query='src=file', fragment='') #也反映了網絡的變化
而urlunsplit方法則是urlsplit的反向方法。是將通過urlsplit生成的的splitresult對象組合成一個URL字符串。這連個方法組合在一起可以有效地格式化URL,特殊字符可以在這個過程中得到轉換
>>> >>> from urllib.parse import urlunsplit
>>> r=urlunsplit(("http","www.python.org","faq","","")) #傳進的參數是一個五元組,也就是一個rulunsplit對象。
>>> r
'http://www.python.org/faq'