• Python爬虫之urllib.parse详解


    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
    中文
  • 相关阅读:
    e生保plus
    Exception analysis
    经验总结:5个应该避免的前端糟糕实践
    经验总结:应对中文输入法的字符串截断方案(带代码示例)
    这些年那些文
    fis入门-单文件编译之文件优化(optimize)
    《HTTP权威指南》读书笔记:缓存
    npm install —— 从一个简单例子,看本地安装与全局安装的区别
    chrome下的Grunt插件断点调试——基于node-inspector
    Yeoman的好基友:Grunt
  • 原文地址:https://www.cnblogs.com/-wenli/p/10894562.html
Copyright © 2020-2023  润新知