urllib.parse — URL解析

urllib.parse - 将URL解析为组件

urllib.parse定义了一个标准接口,用于在组件中解析统一资源定位符(URL)字符串(寻址方案,网络位置,路径等),将组件组合回URL字符串,并将“相对URL”转换为绝对URL给出“基本URL”。

该模块旨在匹配相对统一资源定位器上的Internet RFC。它支持下列URL方案:fileftpgopherhdlhttphttpsimapmailtommsnewsnntpprosperorsyncrtsprtspusftpshttpsipsipssnewssvnsvn+sshtelnetwaiswswss

urllib.parse模块定义了分为两大类的功能:URL解析URL引用

URL解析

URL解析功能侧重于将URL字符串拆分为其组件,或者将URL组件组合为URL字符串。

urllib.parse.urlparse(urlstring,scheme ='',allow_fragments = True )

  • 将URL解析为六个组件,返回一个6个元素的元组,对应URL的一般结构:scheme://netloc/path;parameters?query#fragment。每个元组项都是一个字符串,可能为空。组件不会以较小的部分分解(例如,网络位置是单个字符串),并且不会展开%escapes。如上所示的分隔符不是结果的一部分,除了路径组件中的前导斜杠,如果存在则保留。例如:

    >>> from urllib.parse import urlparse
    >>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
    >>> o
    ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
    >>> o.scheme
    'http'
    >>> o.port
    80
    >>> o.geturl()
    'http://www.cwi.nl:80/%7Eguido/Python.html'
    
  • 只有在'//'正确引入的情况下, urlparse才会识别netloc。否则,假定输入是一个相对URL,将以路径组件开始

     >>> from urllib.parse import urlparse
        
     >>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html')
     ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
     >>> urlparse('www.cwi.nl/%7Eguido/Python.html')
     ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='')
     >>> urlparse('help/Python.html')
     ParseResult(scheme='', netloc='', path='help/Python.html', params='', query='', fragment='')
    
  • scheme参数给出了默认的寻址方案,只有在URL没有指定寻址方案时才使用。它应该是与urlstring相同的类型(文本或字节),只是默认值''总是允许的,并在适当时自动转换为''

    如果allow_fragments参数为false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并fragment在返回值中设置为空字符串。

    返回值是一个元组,这样我们可以通过索引或者吗命名属性访问,如下:

    属性 索引 Value if not present
    scheme 0 协议 scheme参数
    netloc 1 网络位置部分 空字符串
    path 2 分层路径 空字符串
    params 3 最后一个路径元素的参数 空字符串
    query 4 查询 空字符串
    fragment 5 信息片段 空字符串
    username 用户名 None
    password 密码 None
    hostname 主机名 None
    port 端口号 None
  • 如果在URL中指定了无效端口,则读取该port属性将引发ValueError异常。

  • netloc属性中不匹配的方括号将引发ValueError。

  • 与所有命名元组的情况一样,子类还有一些特别有用的附加方法和属性。一种这样的方法是_replace()。该_replace()方法将返回一个新的ParseResult对象,用新值替换指定的字段。

     >>> from urllib.parse import urlparse
     >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html')
     >>> u
     ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
     >>> u._replace(scheme='http')
     ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
    

urllib.parse.parse_qs(qs,keep_blank_values = False,strict_parsing = False,encoding ='utf-8',errors ='replace',max_num_fields = None )

  • 解析作为字符串参数给出的查询字符串(类型为 application / x-www-form-urlencoded的数据)。数据作为字典返回。字典键是唯一的查询变量名称,值是每个名称的值列表。
  • 可选参数keep_blank_values是一个标志,指示百分比编码查询中的空值是否应被视为空字符串。true值表示空格应保留为空字符串。默认的false值表示将忽略空白值并将其视为未包含它们。
  • 可选参数strict_parsing是一个标志,指示如何处理解析错误。如果为false(默认值),则会以静默方式忽略错误。如果为true,则错误会引发ValueError异常。
  • 可选的编码和错误参数指定如何将百分比编码的序列解码为Unicode字符,正如 bytes.decode()方法所接受的那样。
  • 可选参数max_num_fields是要读取的字段的最大数量。如果设置,则如果读取的字段超过max_num_fields,则抛出ValueError。
  • 使用urllib.parse.urlencode()函数(doseq参数设置为True)将这些字典转换成查询字符串。

urllib.parse.parse_qsl(qs,keep_blank_values = False,strict_parsing = False,encoding ='utf-8',errors ='replace',max_num_fields = None )

  • 将给定的查询字符串解析为字符串参数(类型为application/x-www-form-urlencoded的数据)。数据作为名称、值对列表返回。
  • 可选参数keep_blank_values是一个标志,指示百分比编码的查询中的空白值是否应该被视为空白字符串。true值指示空白应保留为空白字符串。默认的false值表示要忽略空白值,并将其视为未包含。
  • 可选参数strict_parser是一个标志,指示如何处理解析错误。如果为false(默认值),错误将被默认忽略。如果为真,错误将引发ValueError异常。
  • 可选的encodingerrors参数指定如何将百分比编码的序列解码为Unicode字符,正如bytes.decode()方法所接受的那样。
  • 可选参数max_num_fields是要读取的字段的最大数量。如果设置,则如果读取的字段超过max_num_fields,则抛出ValueError。
  • 使用urllib.parse.urlencode()函数将这些对列表转换为查询字符串。

urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)

  • 这类似于urlparse(),但不会从URL中分割参数。如果需要将允许参数应用于URL路径部分的每个段的最新URL语法(请参阅RFC 2396),则通常应该使用该方法而不是urlparse()。需要一个单独的函数来分离路径段和参数。这个函数返回5个(对比 urlparse没有params)元素的元组:

    (addressing scheme, network location, path, query, fragment identifier)
    
posted @ 2019-07-06 19:01  久末丶  阅读(5659)  评论(0编辑  收藏  举报