Python 我应该使用哪一个:urlparse还是urlspilt?

Python 我应该使用哪一个:urlparse还是urlspilt?,python,urllib,urlparse,urlsplit,Python,Urllib,Urlparse,Urlsplit,我应该使用哪一种?为什么 和,或 然后呢 直接来自: urllib.parse.urlspit(urlstring,scheme='',allow_fragments=True) 这类似于urlparse(),但不从URL拆分参数。如果需要更新的URL语法,允许将参数应用于URL路径部分的每个段(请参见RFC 2396),则通常应使用此语法,而不是urlparse() 正如上面所说的 urlparse.urlparse返回6元组(带有附加参数元组) urlparse.urlspit返回5元组

我应该使用哪一种?为什么

  • 和,或
  • 然后呢
直接来自:

urllib.parse.urlspit(urlstring,scheme='',allow_fragments=True)

这类似于
urlparse()
,但不从URL拆分参数。如果需要更新的URL语法,允许将参数应用于URL路径部分的每个段(请参见RFC 2396),则通常应使用此语法,而不是
urlparse()

正如上面所说的
urlparse.urlparse
返回6元组(带有附加参数元组)
urlparse.urlspit
返回5元组

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


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

对当前客户端应用程序的广泛测试表明 大多数部署的系统不使用“;”字符来 指示尾部参数信息,以及 路径段中的分号不影响 这一部分。因此,已将参数作为单独的参数删除 组件,现在可能出现在任何路径段中。他们的影响 已从解析相对URI的算法中删除 参考资料


考虑到您链接的文档没有包含带有非空
params
的示例,我也感到困惑,直到找到为止

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

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

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

一开始,RFC1738将HTTP URL设置为从不允许
中的code>:

http://<host>:<port>/<path>?<searchpart>
<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
显然在1995年,RFC 1808 URL
params
作为
path
query
之间的顶级组件:

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
<scheme>://<authority><path>?<query>
其中
路径
是多个
路径_段
,每个段可以包括
参数

path          = [ abs_path | opaque_part ]
abs_path      = "/"  path_segments
path_segments = segment *( "/" segment )
segment       = *pchar *( ";" param )

最后在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
以及
的特殊语法;params
是URI语法的不透明部分,可能特定于HTTP(S)方案或某些特定实现:

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


由于这些URL(带有任何路径元素的参数)在实践中很少使用,也许值得添加一个示例,显示解析结果中的差异?e、 比如这里:对于那些感兴趣的人,你能提供举例说明区别的URL吗?我已经阅读了Python文档并简要介绍了RFC 2396,但不清楚它们所指的是哪种类型的URL参数,只是它们使用了分号。从您的回答来看,不清楚您建议使用哪种方法。这取决于您是否需要URL中的参数,然后使用URLSPILT。