20.16。 urlparse - 将URL解析成组件

Note

Python 3中将urlparse模块重命名为urllib.parse当您将源转换为Python 3时,2to3工具将自动调整导入。

Source code: Lib/urlparse.py

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

该模块被设计为匹配相对统一资源定位符上的Internet RFC。It supports the following URL schemes: file, ftp, gopher, hdl, http, https, imap, mailto, mms, news, nntp, prospero, rsync, rtsp, rtspu, sftp, shttp, sip, sips, snews, svn, svn+ssh, telnet, wais.

新版本2.5:支持sftpsips方案。

urlparse模块定义了以下功能:

urlparse.urlparse(urlstring[, scheme[, allow_fragments]])

将URL解析为六个组件,返回一个6元组。This corresponds to the general structure of a URL: scheme://netloc/path;parameters?query#fragment. 每个元组项都是一个字符串,可能是空的。组件不会在较小的部分分解(例如,网络位置是单个字符串),并且%转义不会展开。如上所示的分隔符不是结果的一部分,除了路径组件中的前导斜杠,如果存在则保留。For example:

>>> 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中的语法规范,urlparse仅在由“//”正确引入时识别netloc。否则,该输入被推定为相对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='')

如果指定了方案参数,它将提供默认寻址方案,仅在URL未指定的情况下才能使用。此参数的默认值为空字符串。

如果allow_fragments参数为false,则不允许使用片段标识符,即使URL的寻址方案通常也支持它们。此参数的默认值为True

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

AttributeIndexValueValue if not present
scheme0URL方案说明符empty string
netloc1网络位置部分empty string
path2分层路径empty string
params3最后一个路径元素的参数empty string
query4查询组件empty string
fragment5片段标识符empty string
username用户名None
password密码None
hostnameHost name (lower case)None
portPort number as integer, if presentNone

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

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

在版本2.7中更改:添加了IPv6 URL解析功能。

urlparse.parse_qs(qs[, keep_blank_values[, strict_parsing]])

解析一个作为字符串参数给出的查询字符串(数据类型为application / x-www-form-urlencoded)。数据作为字典返回。字典键是唯一的查询变量名称,值是每个名称的值列表。

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

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

使用urllib.urlencode()函数将这些字典转换为查询字符串。

新版本2.6:cgi模块复制。

urlparse.parse_qsl(qs[, keep_blank_values[, strict_parsing]])

解析一个作为字符串参数给出的查询字符串(数据类型为application / x-www-form-urlencoded)。数据作为名称,值对的列表返回。

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

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

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

新版本2.6:cgi模块复制。

urlparse.urlunparse(parts)

urlparse()返回的元组构造一个URL。部分参数可以是任何六项可迭代的。如果原先解析的URL不必要的分隔符(例如,一个?空查询; RFC声明这些是等效的)。

urlparse.urlsplit(urlstring[, scheme[, allow_fragments]])

这与urlparse()相似,但不会将该参数与URL分解。一般来说,如果允许将参数应用到URL的路径部分的每个段的更新的URL语法(请参见),通常应该使用这个代替urlparse() RFC 2396)是需要的。需要单独的功能来分隔路径段和参数。该函数返回一个5元组:(寻址方案,网络位置,路径,查询,片段标识符)。

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

AttributeIndexValueValue if not present
scheme0URL方案说明符empty string
netloc1网络位置部分empty string
path2分层路径empty string
query3查询组件empty string
fragment4片段标识符empty string
usernameUser nameNone
passwordPasswordNone
hostnameHost name (lower case)None
portPort number as integer, if presentNone

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

New in version 2.2.

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

urlparse.urlunsplit(parts)

将由urlsplit()返回的元组的元素组合成一个完整的URL作为字符串。部分参数可以是任何五项可迭代的。如果原先解析的URL不必要的分隔符(例如,一个?空查询; RFC声明这些是等效的)。

New in version 2.2.

urlparse.urljoin(base, url[, allow_fragments])

通过将“基本URL”(base)与另一个URL(url)组合构建一个完整的(“绝对”)URL。非正式地,这使用基本URL的组件,特别是寻址方案,网络位置和路径的一部分,以在相对URL中提供缺少的组件。For example:

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

allow_fragments参数与urlparse()具有相同的含义和默认值。

Note

If url is an absolute URL (that is, starting with // or scheme://), the url‘s host name and/or scheme will be present in the result. For example:

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

If you do not want that behavior, preprocess the url with urlsplit() and urlunsplit(), removing possible scheme and netloc parts.

urlparse.urldefrag(url)

如果url包含片段标识符,则返回没有片段标识符的url的修改版本,并将片段标识符作为单独的字符串返回。If there is no fragment identifier in url, returns url unmodified and an empty string.

See also

RFC 3986 - Uniform Resource Identifiers
This is the current standard (STD66). Any changes to urlparse module should conform to this. Certain deviations could be observed, which are mostly due backward compatiblity purposes and for certain de-facto parsing requirements as commonly observed in major browsers.
RFC 2732 - Format for Literal IPv6 Addresses in URL’s.
This specifies the parsing requirements of IPv6 URLs.
RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax
Document describing the generic syntactic requirements for both Uniform Resource Names (URNs) and Uniform Resource Locators (URLs).
RFC 2368 - The mailto URL scheme.
Parsing requirements for mailto url schemes.
RFC 1808 - Relative Uniform Resource Locators
This Request For Comments includes the rules for joining an absolute and a relative URL, including a fair number of “Abnormal Examples” which govern the treatment of border cases.
RFC 1738 - Uniform Resource Locators (URL)
This specifies the formal syntax and semantics of absolute URLs.

20.16.1. urlparse()urlsplit() 的结果

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

ParseResult.geturl()

将原始URL的重新组合版本作为字符串返回。这可能与原始URL不同,因为该方案将始终归一化为小写,并且可能会丢弃空组件。具体来说,空参数,查询和片段标识符将被删除。

该方法的结果是通过原始解析函数传递的修复点:

>>> 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/'

New in version 2.5.

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

class urlparse.BaseResult

具体结果类的基类。这提供了大多数属性定义。它不提供geturl()方法。它来自tuple,但不覆盖__ init __()__ new __()方法。

class urlparse.ParseResult(scheme, netloc, path, params, query, fragment)

urlparse()结果的混合类。覆盖__ new __()方法来支持检查正确数量的参数的传递。

class urlparse.SplitResult(scheme, netloc, path, query, fragment)

urlsplit()结果的具体类。覆盖__ new __()方法来支持检查正确数量的参数的传递。