Python爬蟲之urllib.parse
轉(zhuǎn)載地址
Python 中的 urllib.parse 模塊提供了很多解析和組建 URL 的函數(shù)。
解析url
解析url(?urlparse()?)
urlparse() 函數(shù)可以將 URL 解析成 ParseResult 對(duì)象。對(duì)象中包含了六個(gè)元素,分別為:
協(xié)議(scheme) 域名(netloc) 路徑(path) 路徑參數(shù)( params ) 查詢參數(shù)(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), ' 個(gè)元素 ' ) 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)
結(jié)果為:
parsed_result 包含了 6 個(gè)元素 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
?
?
解析url( urlsplit()?)
?urlsplit() 函數(shù)也能對(duì) URL 進(jìn)行拆分,所不同的是, urlsplit() 并不會(huì)把 路徑參數(shù)(params) 從 路徑(path) 中分離出來(lái)。
當(dāng) URL 中路徑部分包含多個(gè)參數(shù)時(shí),使用 urlparse() 解析是有問(wèn)題的
這時(shí)可以使用 urlsplit() 來(lái)解析:
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 沒(méi)有 params 屬性
結(jié)果為:
SplitResult(scheme= ' http ' , netloc= ' user:pwd@domain:80 ' , path= ' /path1;params1/path2;params2 ' , query= ' query=queryarg ' , fragment= ' fragment ' ) split.path : /path1;params1/path2;params2
?
解析url(urldefrag())
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)
結(jié)果為:
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
?
?
組建URL
組建url(urlunparse())
urlunparse()接收一個(gè)列表的參數(shù),而且列表的長(zhǎng)度是有要求的,是必須六個(gè)參數(shù)以上,否則拋出異常。
from urllib.parse import urlunparse url_compos = ( ' http ' , ' user:pwd@domain:80 ' , ' /path1;params1/path2 ' , ' params2 ' , ' query=queryarg ' , ' fragment ' ) print (urlunparse(url_compos))
結(jié)果為:
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg # fragment
?
?
組建url(urljoin())
urljoin()將兩個(gè)字符串拼接成url,
from urllib.parse import urljoin # 連接兩個(gè)參數(shù)的url, 將第二個(gè)參數(shù)中缺的部分用第一個(gè)參數(shù)的補(bǔ)齊,如果第二個(gè)有完整的路徑,則以第二個(gè)為主 print (urljoin( ' https://movie.douban.com/ ' , ' index ' )) print (urljoin( ' https://movie.douban.com/ ' , ' https://accounts.douban.com/login ' ))
結(jié)果為:
https://movie.douban.com/
index
https:
//accounts.douban.com/login
?
?
查詢參數(shù)的構(gòu)造與解析
?
使用 urlencode() 函數(shù)可以將一個(gè) dict 轉(zhuǎn)換成合法的查詢參數(shù):
from urllib.parse import urlencode query_args = { ' name ' : ' dark sun ' , ' country ' : ' 中國(guó) ' } query_args = urlencode(query_args) print (query_args)
結(jié)果為:
name=dark+sun&country=%E4%B8%AD%E5%9B%BD
?
使用 parse_qs() 來(lái)將查詢參數(shù)解析成 dict。
from urllib.parse import urlencode from urllib.parse import parse_qs query_args = { ' name ' : ' dark sun ' , ' country ' : ' 中國(guó) ' } query_args = urlencode(query_args) print (query_args) print (parse_qs(query_args))
結(jié)果為:
name=dark+sun&country=%E4%B8%AD%E5%9B% BD { ' name ' : [ ' dark sun ' ], ' country ' : [ ' 中國(guó) ' ]}
?
quote()與unquote()
quoteI()對(duì)特殊字符進(jìn)行轉(zhuǎn)義unquote()則相反。
from urllib.parse import quote from urllib.parse import unquote test1 = quote( ' 中文 ' ) print (test1) test2 = unquote(test1) print (test2)
結(jié)果為:
%E4%B8%AD%E6%96%87
中文
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
