我应该使用哪个:urlparse还是urlsplit?

时间:2011-03-29 12:02:52

标签: python urllib urlparse urlsplit

我应该使用哪个URL parsing function pair以及为什么?

3 个答案:

答案 0 :(得分:15)

直接来自the docs you linked yourself

  

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

答案 1 :(得分:5)

正如document所说
urlparse.urlparse返回6元组(附加参数元组)
urlparse.urlsplit返回5元组

  

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


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

  

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

答案 2 :(得分:1)

鉴于您链接的文档中没有包含非空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')

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

除了url组件参数(即/user/213/settings或查询参数/user?id=213)外,我再也没有听说过URL“参数”,我认为它已经过时了。

在一开始,RFC 1738 defined的HTTP URL永远不允许;中的path

http://<host>:<port>/<path>?<searchpart>

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

;在其他方案(like ftp:// url-path)中保留了特殊含义:

<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>

很明显,在1995年,RFC 1808 defined URL params作为pathquery之间的顶级组件:

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

然后在1998年,RFC 2396 defined URI具有相邻的顶级组件pathquery

<scheme>://<authority><path>?<query>

其中pathdefined多个path_segments,每个param可以包含path = [ abs_path | opaque_part ] abs_path = "/" path_segments path_segments = segment *( "/" segment ) segment = *pchar *( ";" param )

URI

最后在2005年,RFC 3986取代了RFC 1808和2396,defining URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty 类似于RFC 2396:

;params

savehistory()的特殊语法是considered,它是URI语法的不透明部分,可能特定于HTTP(S)方案或某些特定实现:

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