Python爬蟲之urllib.parsedom
轉載地址函數
Python 中的 urllib.parse 模塊提供了不少解析和組建 URL 的函數。url
urlparse() 函數能夠將 URL 解析成 ParseResult 對象。對象中包含了六個元素,分別爲:spa
協議(scheme) 域名(netloc) 路徑(path) 路徑參數(params) 查詢參數(query) 片斷(fragment)
from urllib.parse import urlparse url='https://blog.csdn.net/xc_zhou/article/details/80907101' parsed_result=urlparse(url) print('parsed_result 包含了',len(parsed_result),'個元素') print(parsed_result) print('scheme :', parsed_result.scheme) print('netloc :', parsed_result.netloc) print('path :', parsed_result.path) print('params :', parsed_result.params) print('query :', parsed_result.query) print('fragment:', parsed_result.fragment) print('username:', parsed_result.username) print('password:', parsed_result.password) print('hostname:', parsed_result.hostname) print('port :', parsed_result.port)
結果爲:.net
parsed_result 包含了 6 個元素 ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path', params='params', query='query=queryarg', fragment='fragment') scheme : http netloc : user:pwd@domain:80 path : /path params : params query : query=queryarg fragment: fragment username: user password: pwd hostname: domain port : 80
urlsplit() 函數也能對 URL 進行拆分,所不一樣的是, urlsplit() 並不會把 路徑參數(params) 從 路徑(path) 中分離出來。
當 URL 中路徑部分包含多個參數時,使用 urlparse() 解析是有問題的code
這時能夠使用 urlsplit() 來解析:對象
from urllib.parse import urlsplit url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment' split_result=urlsplit(url) print(split_result) print('split.path :', split_result.path) # SplitResult 沒有 params 屬性
結果爲:blog
SplitResult(scheme='http', netloc='user:pwd@domain:80', path='/path1;params1/path2;params2', query='query=queryarg', fragment='fragment') split.path : /path1;params1/path2;params2
from urllib.parse import urldefrag url = 'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment' d = urldefrag(url) print(d) print('url :', d.url) print('fragment:', d.fragment)
結果爲:字符串
DefragResult(url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg', fragment='fragment') url : http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg fragment: fragment
urlunparse()接收一個列表的參數,並且列表的長度是有要求的,是必須六個參數以上,不然拋出異常。get
from urllib.parse import urlunparse url_compos = ('http', 'user:pwd@domain:80', '/path1;params1/path2', 'params2', 'query=queryarg', 'fragment') print(urlunparse(url_compos))
結果爲:
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
urljoin()將兩個字符串拼接成url,
from urllib.parse import urljoin # 鏈接兩個參數的url, 將第二個參數中缺的部分用第一個參數的補齊,若是第二個有完整的路徑,則以第二個爲主 print(urljoin('https://movie.douban.com/', 'index')) print(urljoin('https://movie.douban.com/', 'https://accounts.douban.com/login'))
結果爲:
https://movie.douban.com/index
https://accounts.douban.com/login
使用 urlencode() 函數能夠將一個 dict 轉換成合法的查詢參數:
from urllib.parse import urlencode query_args = { 'name': 'dark sun', 'country': '中國' } query_args = urlencode(query_args) print(query_args)
結果爲:
name=dark+sun&country=%E4%B8%AD%E5%9B%BD
使用 parse_qs() 來將查詢參數解析成 dict。
from urllib.parse import urlencode from urllib.parse import parse_qs query_args = { 'name': 'dark sun', 'country': '中國' } query_args = urlencode(query_args) print(query_args) print(parse_qs(query_args))
結果爲:
name=dark+sun&country=%E4%B8%AD%E5%9B%BD {'name': ['dark sun'], 'country': ['中國']}
quote()與unquote()
quoteI()對特殊字符進行轉義unquote()則相反。
from urllib.parse import quote from urllib.parse import unquote test1 = quote('中文') print(test1) test2 = unquote(test1) print(test2)
結果爲:
%E4%B8%AD%E6%96%87
中文