20.16. urlparse —将 URL 解析为组件

Note

在 python 3 中,urlparse模块重命名为urllib.parse。在将源转换为 Python 3 时,2to3工具将自动适应导入。

源代码: Lib/urlparse.py


该模块定义了一个标准接口,用于分解组件中的统一资源定位符(URL)字符串(寻址方案,网络位置,路径等),将组件组合回 URL 字符串,并将“相对 URL”转换为指定了“基本 URL”的绝对 URL。

设计该模块以匹配相对统一资源定位符上的 Internet RFC。它支持以下 URL 方案:fileftpgopherhdlhttphttpsimapmailtommsnewsnntpprosperorsyncrtsprtspusftpshttp,_22,sip _ ,telnetwais

2.5 版的新Function:支持sftpsips方案。

urlparse模块定义以下Function:

>>> from urlparse 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'

遵循 RFC 1808中的语法规范,仅当'//'正确引入 netloc 时,urlparse 才识别它。否则,假定 Importing 为相对 URL,因此从路径组件开始。

>>> from urlparse 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 未指定一个方案时才使用。此参数的默认值为空字符串。

如果* allow_fragments *参数为 false,则即使 URL 的寻址方案通常支持片段标识符,也不会识别片段标识符并将其解析为前述组件的一部分。此参数的默认值为True

返回值实际上是tuple的子类的实例。此类具有以下附加的只读便捷属性:

Attribute Index Value 值(如果不存在)
scheme 0 URL 方案说明符 * scheme *参数
netloc 1 网络位置部分 empty string
path 2 Hierarchical path empty string
params 3 最后路径元素的参数 empty string
query 4 Query component empty string
fragment 5 Fragment identifier empty string
username User name None
password Password None
hostname 主机名(小写) None
port 端口号为整数(如果存在) None

有关结果对象的更多信息,请参见urlparse()和 urlsplit()的结果部分。

netloc属性中的字符在 NFKC 规范下(由 IDNA 编码使用)分解为/?#@:中的任何一个,将引发ValueError。如果 URL 在解析之前已分解,或者不是 Unicode 字符串,则不会引发任何错误。

在版本 2.5 中进行了更改:添加了属性以返回值。

在 2.7 版中进行了更改:添加了 IPv6 URL 解析Function。

在版本 2.7.17 中更改:在 NFKC 规范下影响 netloc 解析的字符现在将引发ValueError

可选参数* keep_blank_values *是一个标志,指示是否应将百分比编码的查询中的空白值视为空白字符串。真值表示应将空格保留为空白字符串。默认的 false 值指示将忽略空白值并将其视为未包含空白值。

可选参数* strict_parsing *是一个标志,指示如何处理解析错误。如果为 false(默认值),错误将被忽略。如果为 true,则错误会引发ValueError异常。

可选参数* max_num_fields 是要读取的最大字段数。如果设置,则如果读取的 max_num_fields *个字段以上,则抛出ValueError

使用urllib.urlencode()函数可将此类词典转换为查询字符串。

2.6 版的新Function:从cgi模块复制。

在版本 2.7.16 中进行了更改:添加了* max_num_fields *参数。

可选参数* keep_blank_values *是一个标志,指示是否应将百分比编码的查询中的空白值视为空白字符串。真值表示应将空格保留为空白字符串。默认的 false 值指示将忽略空白值并将其视为未包含空白值。

可选参数* strict_parsing *是一个标志,指示如何处理解析错误。如果为 false(默认值),错误将被忽略。如果为 true,则错误会引发ValueError异常。

可选参数* max_num_fields 是要读取的最大字段数。如果设置,则如果读取的 max_num_fields *个字段以上,则抛出ValueError

使用urllib.urlencode()函数将这样的配对列表转换为查询字符串。

2.6 版的新Function:从cgi模块复制。

在版本 2.7.16 中进行了更改:添加了* max_num_fields *参数。

返回值实际上是tuple的子类的实例。此类具有以下附加的只读便捷属性:

Attribute Index Value 值(如果不存在)
scheme 0 URL 方案说明符 * scheme *参数
netloc 1 网络位置部分 empty string
path 2 Hierarchical path empty string
query 3 Query component empty string
fragment 4 Fragment identifier empty string
username User name None
password Password None
hostname 主机名(小写) None
port 端口号为整数(如果存在) None

有关结果对象的更多信息,请参见urlparse()和 urlsplit()的结果部分。

netloc属性中的字符在 NFKC 规范下(由 IDNA 编码使用)分解为/?#@:中的任何一个,将引发ValueError。如果 URL 在解析之前已分解,或者不是 Unicode 字符串,则不会引发任何错误。

2.2 版中的新Function。

在版本 2.5 中进行了更改:添加了属性以返回值。

在版本 2.7.17 中更改:在 NFKC 规范下影响 netloc 解析的字符现在将引发ValueError

2.2 版中的新Function。

>>> from urlparse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'

Note

如果* url 是绝对 URL(即以//scheme://开头),则 url *的主机名和/或方案将出现在结果中。例如:

>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html',
...         '//www.python.org/%7Eguido')
'http://www.python.org/%7Eguido'

如果您不希望出现这种情况,请使用urlsplit()urlunsplit()预处理* url ,并删除可能的 scheme netloc *部分。

See also

  • RFC 3986-统一资源标识符

  • 这是当前标准(STD66)。对 urlparse 模块的任何更改都应符合此要求。可以观察到某些偏差,主要是出于向后兼容的目的以及某些主要浏览器中常见的实际解析要求。

  • RFC 2732-URL 中 LiteralsIPv6 地址的格式。

  • 这指定了 IPv6 URL 的解析要求。

  • RFC 2396-统一资源标识符(URI):通用语法

  • 描述统一资源名称(URN)和统一资源定位符(URL)的通用语法要求的文档。

  • RFC 2368-mailto URL 方案。

  • mailto URL 方案的解析要求。

  • RFC 1808-相对统一资源定位符

  • 该征求意见书包括连接绝对 URL 和相对 URL 的规则,其中包括相当数量的“异常示例”,用于 Management 边境案件的处理。

  • RFC 1738-统一资源定位符(URL)

  • 这指定了绝对 URL 的形式语法和语义。

20.16.1. urlparse()和 urlsplit()的结果

urlparse()urlsplit()函数的结果对象是tuple类型的子类。这些子类添加了这些函数中描述的属性,并提供了其他方法:

如果pass原始解析函数返回,则此方法的结果是一个固定点:

>>> import urlparse
>>> url = 'HTTP://www.Python.org/doc/#'
>>> r1 = urlparse.urlsplit(url)
>>> r1.geturl()
'http://www.Python.org/doc/'
>>> r2 = urlparse.urlsplit(r1.geturl())
>>> r2.geturl()
'http://www.Python.org/doc/'

2.5 版的新Function。

以下类提供了解析结果的实现:

首页