Python爬蟲之urllib.parse
轉(zhuǎn)載地址
Python 中的 urllib.parse 模塊提供了很多解析和組建 URL 的函數(shù)。
解析url
解析url(?urlparse()?)
urlparse() 函數(shù)可以將 URL 解析成 ParseResult 對象。對象中包含了六個元素,分別為:
協(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),
'
個元素
'
)
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
個元素
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ù)也能對 URL 進行拆分,所不同的是, urlsplit() 并不會把 路徑參數(shù)(params) 從 路徑(path) 中分離出來。
當 URL 中路徑部分包含多個參數(shù)時,使用 urlparse() 解析是有問題的
這時可以使用 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 屬性
結(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()接收一個列表的參數(shù),而且列表的長度是有要求的,是必須六個參數(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()將兩個字符串拼接成url,
from
urllib.parse
import
urljoin
#
連接兩個參數(shù)的url, 將第二個參數(shù)中缺的部分用第一個參數(shù)的補齊,如果第二個有完整的路徑,則以第二個為主
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ù)可以將一個 dict 轉(zhuǎn)換成合法的查詢參數(shù):
from
urllib.parse
import
urlencode
query_args
=
{
'
name
'
:
'
dark sun
'
,
'
country
'
:
'
中國
'
}
query_args
=
urlencode(query_args)
print
(query_args)
結(jié)果為:
name=dark+sun&country=%E4%B8%AD%E5%9B%BD
?
使用 parse_qs() 來將查詢參數(shù)解析成 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))
結(jié)果為:
name=dark+sun&country=%E4%B8%AD%E5%9B%
BD
{
'
name
'
: [
'
dark sun
'
],
'
country
'
: [
'
中國
'
]}
?
quote()與unquote()
quoteI()對特殊字符進行轉(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號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

