python和ruby在解析url路径时的不同之处,哪个是有效的?

7cjasjjr  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(373)

我有一个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路径的一部分,哪一个是“正确的”?

mrfwxfqh

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.bbb ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent= 查询= &339286293 片段=空

2mbi3lxu

2mbi3lxu2#

urlparse 扮演 path 在第一个分号之后 params :

url_obj.path   # '/path/to/aaa.bbb/ccc.ddd'
url_obj.params # 'dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent='

要复制ruby的行为,请使用 urlsplit 相反:
这类似于 urlparse() ,但不会从url中拆分参数。通常应使用此选项,而不是 urlparse() 如果需要更新的url语法,允许将参数应用于url路径部分的每个段(请参阅rfc 2396)。

from urllib.parse import urlsplit

url_obj = urlsplit(url)
url_obj.path  # '/path/to/aaa.bbb/ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent='

相关问题