Python爬虫之urllib.parse
转载地址
Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数。
解析url
解析url( urlparse() )
urlparse() 函数可以将 URL 解析成 ParseResult 对象。对象中包含了六个元素,分别为:
协议(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)
(
'
parsed_result 包含了
'
,len(parsed_result),
'
个元素
'
)
(parsed_result)
(
'
scheme :
'
, parsed_result.scheme)
(
'
netloc :
'
, parsed_result.netloc)
(
'
path :
'
, parsed_result.path)
(
'
params :
'
, parsed_result.params)
(
'
query :
'
, parsed_result.query)
(
'
fragment:
'
, parsed_result.fragment)
(
'
username:
'
, parsed_result.username)
(
'
password:
'
, parsed_result.password)
(
'
hostname:
'
, parsed_result.hostname)
(
'
port :
'
, parsed_result.port)
结果为:
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() 函数也能对 URL 进行拆分,所不同的是, urlsplit() 并不会把 路径参数(params) 从 路径(path) 中分离出来。
当 URL 中路径部分包含多个参数时,使用 urlparse() 解析是有问题的
这时可以使用 urlsplit() 来解析:
from
urllib.parse
import
urlsplit
url
=
'
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment
'
split_result
=
urlsplit(url)
(split_result)
(
'
split.path :
'
, split_result.path)
#
SplitResult 没有 params 属性
结果为:
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)
(d)
(
'
url :
'
, d.url)
(
'
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
组建URL
组建url(urlunparse())
urlunparse()接收一个列表的参数,而且列表的长度是有要求的,是必须六个参数以上,否则抛出异常。
from
urllib.parse
import
urlunparse
url_compos
= (
'
http
'
,
'
user:pwd@domain:80
'
,
'
/path1;params1/path2
'
,
'
params2
'
,
'
query=queryarg
'
,
'
fragment
'
)
(urlunparse(url_compos))
结果为:
http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg
#
fragment
组建url(urljoin())
urljoin()将两个字符串拼接成url,
from
urllib.parse
import
urljoin
#
连接两个参数的url, 将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径,则以第二个为主
(urljoin(
'
https://movie.douban.com/
'
,
'
index
'
))
(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)
(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)
(query_args)
(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(
'
中文
'
)
(test1)
test2
=
unquote(test1)
(test2)
结果为:
%E4%B8%AD%E6%96%87
中文