Seite 2 von 2

Re: Download-Skript von Python 2 auf Python 3 portieren

Verfasst: Mittwoch 17. Juli 2019, 19:37
von Atalanttore
@__deets__: So wie ich es jetzt verstanden habe, wird ein Pfad zur URL, wenn er mehr als Verzeichnisnamen und Dateinamen enthält.

Gruß
Atalanttore

Re: Download-Skript von Python 2 auf Python 3 portieren

Verfasst: Mittwoch 17. Juli 2019, 19:48
von __deets__
Naja. Finde ich eine komische Sichtweise. Pfade und URLs haben Überlappungen. Aber das eine ist keine untermenge des anderen. Zb gibt es AFAIK kein Verzeichnis hoch in URLs

Re: Download-Skript von Python 2 auf Python 3 portieren

Verfasst: Mittwoch 17. Juli 2019, 20:01
von Atalanttore
@__deets__: Mit "Verzeichnis hoch" meinst du den Befehl oder etwas anderes?


Nach weiterer Suche bin ich nun auf eine Funktion zur Extraktion des Dateinamens aus einer URL gestoßen.

Ich habe den Code der Funktion auf das Wesentliche gekürzt:

Code: Alles auswählen

def url2filename(url):
    """
    Return basename corresponding to url.
    Based on https://gist.github.com/zed/c2168b9c52b032b5fb7d
    """

    url_path = urllib.parse.urlsplit(url).path
    basename = posixpath.basename(urllib.parse.unquote(url_path))

    if (os.path.basename(basename) != basename or urllib.parse.unquote(posixpath.basename(url_path)) != basename):
        raise ValueError  # reject '%2f' or 'dir%5Cbasename.ext' on Windows
    return basename
Ist diese Funktion ein besserer Ansatz als nur `os.path.basename()` dafür zu verwenden?

Gruß
Atalanttore

Re: Download-Skript von Python 2 auf Python 3 portieren

Verfasst: Mittwoch 17. Juli 2019, 20:15
von __deets__
Nein. Ich meine “../../..”. Das sind immer Pfade. In der Funktion ist mir zu oft unquote aufgerufen, mach das EINMAL am Anfang. Und da man weiß, das URLs den / zur Trennung der Komponenten nutzen, würde ich auch das als simples split Argument benutzten. Da posixpath zu nutzen nur weil das zufällig den gleichen Trenner hat ist nicht wirklich besser als das os.path Modul.

Re: Download-Skript von Python 2 auf Python 3 portieren

Verfasst: Samstag 20. Juli 2019, 18:10
von Atalanttore
@__deets__: Ich habe den Code nach deinen Empfehlungen, sofern ich alles richtig verstanden habe, und noch ein wenig mehr umgebaut. Auf reguläre Ausdrücke habe ich verzichtet.

Code:

Code: Alles auswählen

import fnmatch
import urllib.parse

URL = "https://apod.nasa.gov/image/1906/gendlerM83-New-HST-ESO-LL.jpg"


def get_basename(url, file_extension):
    """Return basename corresponding to url."""

    url_path = urllib.parse.urlsplit(url).path
    unquoted_url= urllib.parse.unquote(url_path)
    basename = unquoted_url.split("/")[-1]

    if not fnmatch.fnmatch(basename, f"*.{file_extension}"):
        raise ValueError

    return basename


print(get_basename(URL, 'jpg'))

Gruß
Atalanttore