Sve*_*ach 15

直接来自您自己链接的文档:

urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)
这类似于urlparse(),但不会从URL中拆分params.urlparse()如果需要更新的URL语法允许将参数应用于URL的路径部分的每个段(请参阅RFC 2396),则通常应该使用此语法.

  • 由于这些URL(附带任何路径元素的参数)很少在实践中使用,或许值得添加一个例子,显示解析结果的差异?例如像这里:http://www.doughellmann.com/PyMOTW/urlparse/#parsing (20认同)
  • [更新 Python 3 链接](https://pymotw.com/3/urllib.parse/#parsing) 感兴趣的人 (2认同)

Car*_*lsh 13

鉴于您链接的文档不包含非空的示例,params我也很困惑,直到找到this

>>> urllib.parse.urlparse("http://example.com/pa/th;param1=foo;param2=bar?name=val#frag")
ParseResult(scheme='http', netloc='example.com', path='/pa/th', params='param1=foo;param2=bar', query='name=val', fragment='frag')
Run Code Online (Sandbox Code Playgroud)

(一些历史,因为我被书呆子狙击了。)

/user/213/settings除了 url 组件参数(即或查询参数)之外,我从未听说过 URL“参数” /user?id=213,我认为它基本上已经过时了。

一开始,RFC 1738定义了永远不允许出现;在以下位置的HTTP URL path

http://<host>:<port>/<path>?<searchpart>
Run Code Online (Sandbox Code Playgroud)

<path><searchpart>组件中,“/”、“;”、“?” 被保留。

;在其他方案中保留有特殊含义,例如ftp:// url-path

<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
Run Code Online (Sandbox Code Playgroud)

显然,在 1995 年,RFC 1808将URL定义为和params之间的顶级组件:pathquery

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
Run Code Online (Sandbox Code Playgroud)

然后在 1998 年,RFC 2396将 URI定义为具有相邻的顶级组件path并且query

<scheme>://<authority><path>?<query>
Run Code Online (Sandbox Code Playgroud)

其中path定义为多个path_segments,每个可以包括param

path          = [ abs_path | opaque_part ]
abs_path      = "/"  path_segments
path_segments = segment *( "/" segment )
segment       = *pchar *( ";" param )
Run Code Online (Sandbox Code Playgroud)

最终在 2005 年,RFC 3986 废弃了 RFC 1808 和 2396,其定义 URI与 RFC 2396 类似:

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ] 

hier-part   = "//" authority path-abempty
            / path-absolute
            / path-rootless
            / path-empty
Run Code Online (Sandbox Code Playgroud)

并且 的特殊语法;params认为是URI 语法的不透明部分,可能特定于 HTTP(S) 方案或只是某些特定实现:

除了分层路径中的点段之外,通用语法认为路径段是不透明的。URI 生成应用程序通常使用段中允许的保留字符来分隔特定于方案或特定于解引用处理程序的子组件。例如,分号(“;”)和等号(“=”)保留字符通常用于分隔适用于该段的参数和参数值。逗号(“,”)保留字符通常用于类似目的。例如,一个 URI 生产者可能使用诸如“name;v=1.1”之类的段来指示对“name”版本 1.1 的引用,而另一个 URI 生产者可能使用诸如“name,1.1”之类的段来指示相同的内容。 参数类型可以通过特定于方案的语义来定义,但在大多数情况下,参数的语法特定于 URI 解除引用算法的实现。


Jia*_* D. 6

正如文档所说,
urlparse.urlparse返回6元组(带有附加参数元组)
urlparse.urlsplit返回5元组

属性|索引| 价值| 值如果不存在
参数| 3 | 最后一个路径元素的参数| 空字符串


仅供参考:根据RFC2396,URL规范中的参数

对当前客户端应用程序的广泛测试表明,大多数已部署的系统不使用";" 用于指示尾随参数信息的字符,以及路径段中分号的存在不会影响该段的相对解析.因此,参数已作为单独的组件删除,现在可能出现在任何路径段中.它们的影响已从用于解析相对URI引用的算法中删除.