У Url Parse отсутствует фрагмент - Python - PullRequest
1 голос
/ 25 февраля 2020

Мне нужно сохранить файл с именем файла данного пути получения.

Учитывая 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

Как вы можете видеть, Parse URL, но "LongCtrl10min.tiff "не находится в разделе фрагмента, но находится в разделе пути. Почему это происходит? Может быть, потому что «AcquisitionPath» является строкой, а UrlParse распознает все как уникальный путь?

РЕДАКТИРОВАТЬ:

a.path РАБОТАЕТ, я хотел бы знать, почему я не получаю его в фрагмент фрагмента.

Вот еще один пример:

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 "

РЕШЕНИЕ:

Фрагменту требуется символ" # "! Спасибо всем.

1 Ответ

1 голос
/ 25 февраля 2020

Здесь есть две проблемы: как определить компоненты URL и как создать желаемый путь из этих компонентов.


Во-первых, вы не понимаете, что на самом деле представляет собой фрагмент. From RF C 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

Фрагмент * - часть, следующая за #, а не весь конечный компонент пути.


Во-вторых, функция urlparse() из модуля urllib возвращает объект ParseResult, а метод basename() из os.path хочет str в качестве аргумента.

Вероятно, вы хотите получить путь от ParseResult -объекта. Вы получите это с помощью a.path (путь, который вы указали с помощью urlparse, сохраняется в атрибуте path объекта ParseResult).

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

...