Python爬虫之urllib.parse详解

系统 1725 0

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)


            
            
              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)
          

结果为:

            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)


            
            
              print
            
            
              (split_result)

            
            
              print
            
            (
            
              '
            
            
              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)

            
            
              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
            
          

 

 

组建URL

组建url(urlunparse())

urlunparse()接收一个列表的参数,而且列表的长度是有要求的,是必须六个参数以上,否则抛出异常。

            
              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
            
          

 

 

组建url(urljoin())

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
            
              
中文
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论