python3 url解析 urllib.parse.urlparse 库简介

urllib.parse - 将URL解析为组件

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

该模块旨在匹配相对统一资源定位器上的Internet RFC。它支持下列URL方案:fileftpgopherhdlhttphttpsimapmailtomms, newsnntpprosperorsyncrtsprtspusftp, shttpsipsipssnewssvnsvn+sshtelnet, waiswswss

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
scheme0协议scheme参数
netloc1网络位置部分空字符串
path2分层路径空字符串
params3最后一个路径元素的参数空字符串
query4查询空字符串
fragment5信息片段空字符串
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异常。

可选的encoding 和errors参数指定如何将百分比编码的序列解码为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)

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值