微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解析URL路径时python和ruby之间的不同,哪个有效?

如何解决解析URL路径时python和ruby之间的不同,哪个有效?

我有一个 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`

使用红宝石时

url_obj = URI.parse(url)

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

我猜python认为;不是url路径的一部分,哪个是“正确的”?

解决方法

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 中分离参数。如果需要更新的 URL 语法,允许将参数应用于 URL 的 path 部分的每个段(请参阅 RFC 2396),则通常应使用它而不是 urlparse()。 >

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='
,

Python 的 urllib 是错误的。 RFC 3986 Uniform Resource Identifier (URI): Generic Syntax,Section 3.3 Path 明确给出了这个确切的语法作为有效路径的示例[粗体强调我的]:

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

对您发布的示例 URI 的正确解释如下:

  • 方案 = https
  • 权限 = foo.bar.com
    • userinfo = 空
    • host = foo.bar.com
    • port = 空,源自 scheme443
  • path = /path/to/aaa.bbb/ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent=,由以下四个路径段组成:
    1. path
    2. to
    3. aaa.bbb
    4. ccc.ddd;dc_trk_aid=486652617;tfua=;gdpr=;gdpr_consent=
  • 查询 = &339286293
  • fragment = 空

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。