我有一个url字符串,如下所示:
url = "https://foo.bar.com/path/to/aaa.bbb/ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent=?&339286293"
使用python时
from urllib.parse import urlparse
url_obj = urlparse(url)
url_obj.path # `path/to/aaa.bbb/ccc.ddd`
使用ruby时
url_obj = URI.parse(url)
url_obj.path # `path/to/aaa.bbb/ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent=`
我猜Python正在考虑中。 ;
不是url路径的一部分,哪一个是“正确的”?
2条答案
按热度按时间mrfwxfqh1#
Python的
urllib
这是错误的。rfc 3986统一资源标识符(uri):通用语法,第3.3节路径明确给出了此确切语法,作为有效路径的示例[bold emphasis mine]:除了分层路径中的点段之外,一般语法认为路径段是不透明的。产生uri的应用程序通常使用段中允许的保留字符来分隔特定于方案或取消引用特定于处理程序的子组件。例如,分号(“;”)和等于(“=”)保留字符通常用于分隔适用于该段的参数和参数值。逗号(“,”)保留字符通常用于类似目的。例如,一个uri生产者可能会使用诸如“name;v=1.1“表示对“名称”1.1版的引用,而另一个可能使用“名称,1.1”等段表示相同。参数类型可以由特定于方案的语义定义,但在大多数情况下,参数的语法特定于uri的解引用算法的实现。
您发布的示例uri的正确解释如下:
方案=
https
授权=foo.bar.com
userinfo=空主机=
foo.bar.com
端口=空,从要创建的方案派生443
路径=/path/to/aaa.bbb/ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent=
,由以下四个路径段组成:path
to
aaa.bbbccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent=
查询=&339286293
片段=空2mbi3lxu2#
urlparse
扮演path
在第一个分号之后params
:要复制ruby的行为,请使用
urlsplit
相反:这类似于
urlparse()
,但不会从url中拆分参数。通常应使用此选项,而不是urlparse()
如果需要更新的url语法,允许将参数应用于url路径部分的每个段(请参阅rfc 2396)。