Download einer PDF Datei über das Internet

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
choallin
User
Beiträge: 6
Registriert: Sonntag 13. November 2011, 12:11

Hallo Leute!

Hab mich jetzt eintschlosse Python zu lernen. Hab dafür ein kleines Lernprojekt am laufen, das aus einer .txt Datei über eine RegEx bestimme Strings ausgelesen und in eine csv Datei gespeichert wird. Das funktioniert soweit auch schon wunderbar.
Zum Erweitern des Projekts, hab ich mir gedacht möchte ich jetzt von einer Internetseite eine PDF Datei herunterladen und diese zuerst speichern. Im nächsten Schritt möchte ich dann den Inhalt dieser Datei in eine txt Datei kopieren und dort wieder alle Strings die mir die RegEx zurückgibt in eine csv Datei speichern.

Bis jetzt schaut es so aus, das ich beim Download der Datei mit dem Modul urllib.request die Verbindung zur Url herstelle und mit readlines() den Inhalt des zurückgegebenen Wertes in einem Objekt gespeichert habe. Gibt es da eine etwas elegantere Lösung, mit der ich evtl gleich die Rückgabe als Datei speichern kann?

Hier ist der Code:

Code: Alles auswählen

while(success == False):
    try:
        url = urllib.request.urlopen(newURL,)
        success = True
    except:
        print('Die angegebene URL konnte nicht gefunden werden.')
        newURL = input('Bitte gib einen neuen Pfad ein. Zum Abbrechen gib "A" ein\n')
        if(newURL == 'A'):
            sys.exit(0)

wtPdf = url.readlines()
url.close()

pfad = '/home/user/Dokumente/'
try:
    pdf = open(pfad+'wt.txt','w')
    success = True
    #pdf Datei die im gedownloaded wird Zeiel für Zeile in Datei speichern
    pickle.dump(wtPdf, pdf)
except:
    print('WARNUNG: Kann die Datei nicht speichern.\n Bitte versuchen sie es später noch mal')
Hat jemand eine Idee dafür?

so long
choallin
Zuletzt geändert von Anonymous am Sonntag 13. November 2011, 13:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@choallin: Das ganze Programm sieht ziemlich unelegant aus. Gleich in der ersten Zeile gibt es einen `NameError` weil `success` nicht definiert wird. Um Bedingungen braucht man keine Klammern. Einen Wahrheitswert braucht man nicht noch einmal mit einem Wahrheitswert vergleichen um dann doch nur wieder einen Wahrheitswert heraus zu bekommen. Der Name `url` wird an etwas gebunden was gar keine URL ist. `newURL` wird verwendet bevor es definiert wurde. `success` ist im Grunde überflüssig.

Man sollte nie ein ``except`` ohne eine konkrete Ausnahme anzugeben verwenden. So verschluckt die Ausnahmebehandlung einfach *alles*. So ist es schwer Fehler zu finden wenn dann einmal Ausnahmen vorkommen mit denen man nicht gerechnet hat.

`readlines()` für Binärdaten, also Dateien die eigentlich gar nicht aus Zeilen bestehen, anzuwenden ist unsinnig. Die Beschreibung „Zeiel (sic) für Zeile in Datei speichern“ passt nicht wirklich auf `pickle.dump()`. Warum speicherst Du nicht einfach die Binärdaten, damit Du am Ende eine ganz normale PDF-Datei auf der Platte hast?

Um an den Text in einer PDF-Datei heran zu kommen, musst Du Dir ein entsprechendes Python-Modul suchen was diese Daten extrahieren kann, oder ein externes Programm dafür starten.
choallin
User
Beiträge: 6
Registriert: Sonntag 13. November 2011, 12:11

Zur Erkärung: Die Variablen werden schon alle vorher belegt. Ich hab nur den relevanten Teil hier gepostet.
Das mit den Klammern bin ich von anderen Programmiersprachen gewohnt, werde ich aber in Zukunft bei Python unterlassen, danke für den Hinweis.
Mit Exception Handling hab ich es noch nicht so, muss mich da erst ein bisschen damit befassen. Werde das aber gleich umstellen.
BlackJack hat geschrieben: `readlines()` für Binärdaten, also Dateien die eigentlich gar nicht aus Zeilen bestehen, anzuwenden ist unsinnig. Die Beschreibung „Zeiel (sic) für Zeile in Datei speichern“ passt nicht wirklich auf `pickle.dump()`. Warum speicherst Du nicht einfach die Binärdaten, damit Du am Ende eine ganz normale PDF-Datei auf der Platte hast?
Genau das will ich ja machen, weiß aber nicht genau wie ich das was ich bekomme einfach speichern kann... . Wie heißt die Funktion die das macht?
Eine Idee:
Die Datei im Modu wb öffnen, und dann mit
fh.write(urllib.request.urlopen(url))
beschreiben. Ein Problem was ich dabei aber habe, ich kann die Datei nicht im wb Modus öffnen. Jedesmal wenn ich es versuche bekomme ich einen Fehler... .
BlackJack

@choallin: Du solltest versuchen komplett ohne das `success` aus zu kommen. Wenn man den Programmfluss ordentlich strukturiert, dann braucht man in der Regel keine Variable die einem den Erfolg von einer Aktion von Programmabschnitt zu Programmabschnitt signalisiert.

Du musst die Daten lesen und dann in eine Datei speichern. Dein Problem ist nicht dass Du die Datei nicht im 'wb'-Modus öffnen kannst, das funktioniert. Du versuchst da ein Dateiobjekt zu speichern wo aber die Daten erwartet werden.

Noch zum ersten Programm: Dateipfade sollte man nicht mit ``+`` sondern mit `os.path.join()` zusammen fügen. Und Pickle-Dateien sind auch Binärdaten, die Datei dafür muss auch mit 'wb' geöffnet werden.
Antworten