20.16. urlparse — 将 URL 解析为组件 — Python 文档
20.16. 网址解析 — 将 URL 解析为组件
源代码: :source:`Lib/urlparse.py`
该模块定义了一个标准接口来分解组件(寻址方案、网络位置、路径等)中的统一资源定位器 (URL) 字符串,将组件组合回 URL 字符串,并将“相对 URL”转换为给定“基本 URL”的绝对 URL。
该模块旨在匹配 Internet RFC 上的相对统一资源定位符。 它支持以下 URL 方案:file
、ftp
、gopher
、hdl
、http
、https
、[ X105X]、mailto
、mms
、news
、nntp
、prospero
、[X1718X][X1718X][X1718X] ]、rtspu
、sftp
、shttp
、sip
、sips
、snews
、svn+ssh
、telnet
、wais
。
2.5 新功能: 支持 sftp
和 sips
方案。
urlparse 模块定义了以下函数:
- urlparse.urlparse(urlstring[, scheme[, allow_fragments]])
将 URL 解析为六个组件,返回一个 6 元组。 这对应于 URL 的一般结构:
scheme://netloc/path;parameters?query#fragment
。 每个元组项都是一个字符串,可能为空。 组件没有分解成更小的部分(例如,网络位置是单个字符串),并且 % escapes 没有展开。 上面显示的分隔符不是结果的一部分,除了 path 组件中的前导斜杠,如果存在则保留。 例如:>>> 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='')
如果指定了 scheme 参数,则它给出默认寻址方案,仅在 URL 未指定时使用。 此参数的默认值为空字符串。
如果 allow_fragments 参数为 false,片段标识符不会被识别和解析为前面组件的一部分,即使 URL 的寻址方案通常支持它们。 此参数的默认值为 True。
返回值实际上是 tuple 的一个子类的实例。 此类具有以下额外的只读便利属性:
属性
指数
价值
值如果不存在
scheme
0
URL 方案说明符
方案参数
netloc
1
网络定位部分
空字符串
path
2
分层路径
空字符串
params
3
最后一个路径元素的参数
空字符串
query
4
查询组件
空字符串
fragment
5
片段标识符
空字符串
username
用户名
password
密码
hostname
主机名(小写)
port
端口号为整数(如果存在)
有关结果对象的更多信息,请参见 urlparse() 和 urlsplit() 的结果部分。
netloc
属性中的字符在 NFKC 规范化(如 IDNA 编码所使用)下分解为/
、?
、#
、@
或:
将引发ValueError
。 如果 URL 在解析之前被分解,或者不是 Unicode 字符串,则不会引发错误。在 2.5 版更改: 添加属性以返回值。
2.7 版更改: 添加 IPv6 URL 解析功能。
2.7.17 版本更改: NFKC 规范化下影响 netloc 解析的字符现在将提高
ValueError
。
- urlparse.parse_qs(qs[, keep_blank_values[, strict_parsing[, max_num_fields]]])
解析作为字符串参数给出的查询字符串(application/x-www-form-urlencoded 类型的数据)。 数据作为字典返回。 字典键是唯一的查询变量名称,值是每个名称的值列表。
可选参数 keep_blank_values 是一个标志,指示百分比编码查询中的空白值是否应视为空白字符串。 真值表示应将空白保留为空白字符串。 默认 false 值表示将忽略空白值并将其视为不包括在内。
可选参数 strict_parsing 是一个标志,指示如何处理解析错误。 如果为 false(默认值),错误将被静默忽略。 如果为 true,则错误会引发
ValueError
异常。可选参数 max_num_fields 是要读取的最大字段数。 如果设置,则在读取的字段超过 max_num_fields 时抛出
ValueError
。使用 urllib.urlencode() 函数将此类字典转换为查询字符串。
2.6 版新功能:复制自 cgi 模块。
2.7.16 版更改: 添加 max_num_fields 参数。
- urlparse.parse_qsl(qs[, keep_blank_values[, strict_parsing[, max_num_fields]]])
解析作为字符串参数给出的查询字符串(application/x-www-form-urlencoded 类型的数据)。 数据以名称、值对列表的形式返回。
可选参数 keep_blank_values 是一个标志,指示百分比编码查询中的空白值是否应视为空白字符串。 真值表示应将空白保留为空白字符串。 默认 false 值表示将忽略空白值并将其视为不包括在内。
可选参数 strict_parsing 是一个标志,指示如何处理解析错误。 如果为 false(默认值),错误将被静默忽略。 如果为 true,则错误会引发
ValueError
异常。可选参数 max_num_fields 是要读取的最大字段数。 如果设置,则在读取的字段超过 max_num_fields 时抛出
ValueError
。使用 urllib.urlencode() 函数将此类对列表转换为查询字符串。
2.6 版新功能:复制自 cgi 模块。
2.7.16 版更改: 添加 max_num_fields 参数。
- urlparse.urlunparse(parts)
- 从
urlparse()
返回的元组构造 URL。 parts 参数可以是任何六项可迭代的。 如果最初解析的 URL 具有不必要的分隔符(例如,一个 ? 带有空查询; RFC 声明这些是等效的)。
- urlparse.urlsplit(urlstring[, scheme[, allow_fragments]])
这类似于 urlparse(),但不会从 URL 中分离参数。 如果更新的 URL 语法允许将参数应用于 URL 的 path 部分的每个段,则通常应使用它代替 urlparse()(请参阅 ]RFC 2396) 是需要的。 需要一个单独的函数来分隔路径段和参数。 此函数返回一个 5 元组:(寻址方案、网络位置、路径、查询、片段标识符)。
返回值实际上是 tuple 的一个子类的实例。 此类具有以下额外的只读便利属性:
属性
指数
价值
值如果不存在
scheme
0
URL 方案说明符
方案参数
netloc
1
网络定位部分
空字符串
path
2
分层路径
空字符串
query
3
查询组件
空字符串
fragment
4
片段标识符
空字符串
username
用户名
password
密码
hostname
主机名(小写)
port
端口号为整数(如果存在)
有关结果对象的更多信息,请参见 urlparse() 和 urlsplit() 的结果部分。
netloc
属性中的字符在 NFKC 规范化(如 IDNA 编码所使用)下分解为/
、?
、#
、@
或:
将引发ValueError
。 如果 URL 在解析之前被分解,或者不是 Unicode 字符串,则不会引发错误。2.2 版中的新功能。
在 2.5 版更改: 添加属性以返回值。
2.7.17 版本更改: NFKC 规范化下影响 netloc 解析的字符现在将提高
ValueError
。
- urlparse.urlunsplit(parts)
将 urlsplit() 返回的元组元素组合成一个完整的 URL 作为字符串。 parts 参数可以是任何五项可迭代的。 如果最初解析的 URL 具有不必要的分隔符(例如,一个 ? 带有空查询; RFC 声明这些是等效的)。
2.2 版中的新功能。
- urlparse.urljoin(base, url[, allow_fragments])
通过将“基本 URL” (base) 与另一个 URL (url) 组合来构建完整的(“绝对”)URL。 非正式地,这使用基本 URL 的组件,特别是寻址方案、网络位置和(部分)路径,来提供相对 URL 中缺少的组件。 例如:
>>> from urlparse import urljoin >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html') 'http://www.cwi.nl/%7Eguido/FAQ.html'
allow_fragments 参数与 urlparse() 具有相同的含义和默认值。
笔记
如果 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 部分。
- urlparse.urldefrag(url)
- 如果 url 包含片段标识符,则返回没有片段标识符的 url 的修改版本,并将片段标识符作为单独的字符串。 如果 url 中没有片段标识符,则返回未修改的 url 和一个空字符串。
也可以看看
- RFC 3986 - 统一资源标识符
- 这是当前的标准 (STD66)。 对 urlparse 模块的任何更改都应符合此要求。 可以观察到某些偏差,这主要是出于向后兼容性目的以及在主要浏览器中常见的某些事实上的解析要求。
- RFC 2732 - URL 中文字 IPv6 地址的格式。
- 这指定了 IPv6 URL 的解析要求。
- RFC 2396 - 统一资源标识符 (URI):通用语法
- 描述统一资源名称 (URN) 和统一资源定位符 (URL) 的通用句法要求的文档。
- RFC 2368 - mailto URL 方案。
- mailto URL 方案的解析要求。
- RFC 1808 - 相对统一资源定位符
- 此征求意见稿包括加入绝对和相对 URL 的规则,包括相当数量的“异常示例”,这些“异常示例”管理边界案例的处理。
- RFC 1738 - 统一资源定位符 (URL)
- 这指定了绝对 URL 的正式语法和语义。
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/'
2.5 版中的新功能。
以下类提供解析结果的实现:
- class urlparse.ParseResult(scheme, netloc, path, params, query, fragment)
- urlparse() 结果的具体类。
- class urlparse.SplitResult(scheme, netloc, path, query, fragment)
- urlsplit() 结果的具体类。