【问题标题】:Url Parse is missing fragment - PythonUrl Parse 缺少片段 - Python
【发布时间】:2020-02-25 15:51:33
【问题描述】:

我需要用给定采集路径的文件名保存一个文件。

给定一个 URL,我想解析它并提取文件名,这是我的代码...

我读取了一个 JSON 参数并将其提供给 Parse Url 函数。获取路径为字符串。

ParseUrl.py:

from urllib.parse import urlparse as up
a = up(jtp["AcquisitionPath"])    # => http://127.0.0.1:8000/Users/YodhResearch/Desktop/LongCtrl10min.tiff
print(a)
print(os.path.basename(a))

结果:

ParseResult(scheme='http', netloc='127.0.0.1:8000', path='/Users/YodhResearch/Desktop/LongCtrl10min.tiff', params='', query='', fragment='')
[....]
TypeError: expected str, bytes or os.PathLike object, not ParseResult

如您所见,解析 URL,但“LongCtrl10min.tiff”不在片段部分,而是全部在路径部分。为什么会这样?可能是因为“AcquisitionPath”是一个字符串,而 UrlParse 将所有这些都识别为唯一路径?

编辑:

a.path WORKS,我想知道为什么我不把它放到片段部分。

这是另一个例子:

from urllib.parse import urlparse as up

string = "http://127.0.0.1:8000/GIULIO%20FERRARI%20FOLDER/Giulio%20_%20CSV/Py%20Script/sparse%20python/tiff_test.tiff_IDAnal#1_IDAcq#10_TEMP_.json"

a = up(string)
print(a)
print(os.path.basename(a))

结果:

ParseResult(scheme='http', netloc='127.0.0.1:8000', path='/GIULIO%20FERRARI%20FOLDER/Giulio%20_%20CSV/Py%20Script/sparse%20python/tiff_test.tiff_IDAnal', params='', query='', fragment='1_IDAcq#10_TEMP_.json')

看,现在它没有得到应该是的正确片段:“tiff_test.tiff_IDAnal#1_IDAcq#10_TEMP_.json”

解决方案:

片段需要'#'符号!谢谢大家。

【问题讨论】:

  • 试试os.path.basename(a.path)
  • 它有效,但我想知道为什么我不把它放到片段部分
  • dont get it into fragment section 是什么意思?
  • 因为 url 中的 fragment 格式为 http://127.0.0.1:8000/Users/YodhResearch/Desktop/LongCtrl10min.tiff#fragment
  • 您可能想要看到它,但您不会,因为文件名不是片段的一部分。片段开始#.

标签: python filenames urllib urlparse


【解决方案1】:

这里有两个问题:如何识别 URL 的组成部分,以及如何从这些组成部分创建所需的路径。


首先,您对片段实际上是什么感到困惑。来自RFC 3986

The following are two example URIs and their component parts:

         foo://example.com:8042/over/there?name=ferret#nose
         \_/   \______________/\_________/ \_________/ \__/
          |           |            |            |        |
       scheme     authority       path        query   fragment
          |   _____________________|__
         / \ /                        \
         urn:example:animal:ferret:nose

片段只是# 之后的部分,而不是路径的整个最终组成部分。


其次,来自urllib 模块的urlparse() 函数返回一个ParseResult 对象,而来自os.pathbasename() 方法想要一个str 作为参数。

您可能想要的是从ParseResult-object 获取路径。您将通过a.path 获得此信息(您通过urlparse 给出的路径保存在ParseResult 对象的属性path 中)。

from urllib.parse import urlparse as up
a = up("http://127.0.0.1:8000/Users/YodhResearch/Desktop/LongCtrl10min.tiff")
print(os.path.basename(a.path))

这将输出:

LongCtrl10min.tiff

如果您还想包含片段,您可以通过显式添加它来做到这一点。片段保存在 ParseResult 对象中的一个单独属性中,即在您的情况下为 a.fragment

from urllib.parse import urlparse as up 
a = up("http://127.0.0.1:8000/Users/YodhResearch/Desktop/LongCtrl10min.tiff#anyfragment") 
print(os.path.basename(a.path) + "#" + a.fragment)                     

将输出:

LongCtrl10min.tiff#anyfragment

【讨论】:

  • 它适用于 a.path 但我想知道为什么我没有将它放入片段部分。
  • 我对问题进行了编辑,看看。泰:)
  • 您最初的问题并不清楚。我也更新了我的答案。
  • 感谢您的回答 :) 我不知道“#”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多