Öffnen von URLs

(Auszug aus "Python & XML" von Christopher A. Jones & Fred L. Drake, Jr.)

Der Protokollteil einer URL kann irgend etwas sein, das eine bearbeitende Software verstehen kann. Die vielleicht häufigsten URL-Protokolle (auch Schemata genannt) sind HTTP, FTP und FILE. HTTP wird für die Verbindung zu Webdiensten benutzt, FTP für das Empfangen von Dateien und FILE, um lokale Dateien zu empfangen. All das kann man sehr leicht mit Pythons urllib-Modul erledigen.

Die Funktion urllib.urlopen ist zuständig für das Öffnen aller Arten von URLs und liefert Ihnen ein dateiähnliches Objekt zurück, mit dem Sie arbeiten können. Bei einer lokalen Datei benutzen Sie einfach den Dateinamen. Um z. B. ein XML-Dokument im lokalen Verzeichnis zu öffnen, können Sie folgende Syntax benutzen:

>>> from urllib import urlopen          
>>> fd = urlopen("order.xml")
>>> print fd.read( )
<?xml version="1.0"?>
<!DOCTYPE order SYSTEM "order.dtd">
<order>
      <customer_name>eDonkey Enterprises</customer_name>
      <sku>343-3940938</sku>
      <unit_price>39.95</unit_price>
</order>

>>> fd.close( )

Die urlopen-Funktion gibt ein datei-ähnliches Objekt zurück. Dieses Objekt kann dann wie eine Datei behandelt werden, um an dessen Inhalt zu gelangen und ihn darzustellen. Wenn das Dateiobjekt geschlossen wird, räumt auch urlopen damit auf und beendet die Verbindung zum entfernten Server oder zur lokalen Datei.

Verwenden von FTP

Die Funktion urlopen funktioniert bei entfernten Dateien genausogut wie bei lokalen Dateien, vorausgesetzt, Sie sind mit dem Internet verbunden. Wenn Sie etwa eine URL für das Wurzelverzeichnis eines FTP-Servers angeben, können Sie vielleicht dessen Inhalte wie folgt anzeigen:

>>> fd = urlopen("ftp://ftp.oreilly.com")
>>> print fd.read( )
total 64
drwxr-xr-x 3 61             512 Aug 29 2000 bin             
drwxr-xr-x 2 3              512 Aug 30 2000 dev
drwxr-xr-x 4 61             512 Oct 16 2000 etc
lrwxrwxrwx 1 1               12 Aug 31 2000 examples -> pub/examples
drwxrwx-wx 2 100            512 May 7 22:22 incoming
drwxrws--x 48 61          17408 May 6 04:00 intl
drwxr-xr-x 2 1              512 Sep 1 2000 lost+found
drwxrws--x 55 61           4608 May 7 22:22 outgoing
drwxrwsr-x 21 61            512 Mar 30 21:47 pub
drwxr-xr-x 2 61             512 Aug 31 2000 published
drwxr-sr-x 4 100            512 Apr 17 17:17 software
dr-xr-xr-x 5 61             512 Aug 30 2000 usr

>>> fd.close( )

Laden von URL-Inhalten

urlretrieve ist ähnlich zu urlopen. Diese Funktion akzeptiert einen optionalen Dateinamen, falls Sie die entfernte Datei bei sich lokal speichern möchten, und liefert ein Tupel aus dem Dateinamen und den tatsächlichen Daten als MIME-Nachricht zurück. Hier ein Beispiel:

>>> from urllib import urlretrieve
>>> ob = urlretrieve("ftp://ftp.oreilly.com", "menu.txt")
>>> ob
('menu.txt', <mimetools.Message instance at 007F382C>)

Das erste Argument ist die eigentliche URL, zu der eine Verbindung hergestellt werden soll, während das zweite Argument der Name einer lokalen Datei ist, die die Daten aufnimmt.

Eine der aufregendsten Eigenschaften von urlretrieve ist seine Callback-Funktionalität. Beim Empfang eines Dokuments können Sie eine Callback-Methode als optionalen dritten Parameter angeben, um Mitteilungen über den Fortschritt beim Ladevorgang der Ressource zu erhalten.

Wenn Sie eine Callback-Methode angeben, erwartet urlretrieve, daß diese drei Argumente zuläßt. Das erste Argument ist die aktuelle Blocknummer des Blocks, der gerade geladen wird. Das zweite Argument ist die benutzte Blockgröße, und das dritte ist die Gesamtgröße der Datei. Das folgende Beispiel zeigt eine einfache Routine, die über ihre Fortschritte berichtet.

Beispiel: retrieve.py

"""
retrieve.py
"""
from urllib import urlretrieve

def callback(blocknum, blocksize, totalsize):
    print "Geladen: " + str((blocknum * blocksize)),
    print " von ", totalsize

urlretrieve("http://www.example.com/pyxml.xml", "px.xml", callback)
print "Ladeoperation komplett"

Das laufende Beispiel zeigt Ihnen:

C:\WINDOWS\Desktop\oreilly\pythonxml\c8>python retrieve.py
Geladen: 0 von 116063
Geladen: 8192 von 116063
Geladen: 16384 von 116063
Geladen: 24576 von 116063
Geladen: 32768 von 116063
Geladen: 40960 von 116063
Geladen: 49152 von 116063
Geladen: 57344 von 116063
Geladen: 65536 von 116063
Geladen: 73728 von 116063
Geladen: 81920 von 116063
Geladen: 90112 von 116063
Geladen: 98304 von 116063
Geladen: 106496 von 116063
Geladen: 114688 von 116063
Geladen: 122880 von 116063
Geladen: 131072 von 116063
Ladeoperation komplett

Diese Callback-Funktionalität ist hervorragend geeignet, um über die Fortschritte eines FTP-Vorgangs auf dem laufenden zu bleiben. Sie ist auch dann immer sehr hilfreich, wenn Sie ein Auge auf lange Ladeoperationen haben oder einen frustrierten, wartenden Endbenutzer über den Status des Ladevorgangs informieren wollen.

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Python & XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2002 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Python & XML" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de