Arbeiten mit URLs

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

Eine URL enthält eine Menge Internetinformationen in einem einzelnen String. Sie benennt den Server, die Datei auf dem Server, beliebige Daten, die Sie angeben, um eine dynamische Antwort zu erzeugen, und sogar das zu verwendende Protokoll, mit dem die Informationen geholt werden sollen. In einfacher Form sehen URLs so aus:

"http://www.oreilly.com/oreilly/about.html"

Diese URL hat drei Bestandteile. Der erste Abschnitt sagt Ihnen (oder Ihrer Software), welches Protokoll mit dieser Ressource verwendet werden soll. In diesem Fall ist es HTTP, angegeben durch http:. Der nächste Abschnitt gibt den Servernamen und die entsprechende Domain an. Hier lautet der Server www, und die Domain ist oreilly.com, zusammen also //www.oreilly.com. Was dann folgt, ist ein Pfadname (/oreilly/ ) und ein Dateiname (about.html). Ihr Browser zieht aus diesen Informationen die brilliante Schlußfolgerung, sich über HTTP mit www auf oreilly.com zu verbinden, und lädt von dort die Datei /oreilly/about.html.

Natürlich können URLs komplizierter werden. Wenn Sie »Python« in eine Suchmaske eingeben und die Suche starten, könnte Ihr Browser eine URL ähnlich zu folgender aufsuchen:

"http://search.oreilly.com/cgi-bin/search?term=Python&category=All&pref=all"

Nun gibt es ein paar weitere Teile zu untersuchen. Erstens hat der Server von www zu search gewechselt. Zweitens ist der Pfad nun /cgi-bin/ statt /oreilly/. Der Dateiname about.html wurde durch ein neues Ziel namens search ersetzt. Aber am interessantesten ist das Fragezeichen und die Daten, die dahinter folgen:

 ?term=Python&category=All&pref=all 

Dieser Teil der URL ist als Abfrage-String (query string) bekannt. Wenn search ein CGI-Programm ist (oder etwas Ähnliches innerhalb eines Anwendungsservers), wird ihm der Abfrage-String in Form einer Umgebungsvariable übergeben. Das CGI-Programm kann den String auseinanderpflücken, um festzustellen, daß eine Variable namens term auf Python gesetzt wird und daß category und pref jeweils gleich All und all sind. Wie Sie sich vorstellen können, ist diese Information wichtig für die O’Reilly-Datenbank, und die passende Produktinformation wird an Ihren Browser zurückgegeben.

Angenommen, Sie hätten die O’Reilly-Site jedoch nicht nach »Python«, sondern nach »Python!« durchsucht. Wie sieht die URL nun aus? Nun, der einzige Unterschied ist der, daß das Ausrufezeichen URL-codiert ist. Das heißt, es sind nur einige wenige Sonderzeichen in einer URL erlaubt, alle anderen werden durch ihren entsprechenden Hexadezimal-Code ausgedrückt und durch ein Prozentzeichen (%) begrenzt. Diesmal sieht der Abfrage-String etwas anders aus:

 ?term=Python%21&category=All&pref=all 

Das Ausrufezeichen ist nun durch %21 ersetzt, was dessen URL-codierte Entsprechung ist.

Codieren von URLs

Wenn Sie eine URL für die Datenübergabe an eine Website programmatisch erzeugen, müssen Sie Parameter im Abfrage-String angeben, wie im vorigen Abschnitt gezeigt wurde.

Die programmatische Konstruktion von URLs ist eventuell dann nötig, wenn Sie Ihr Python-Programm in eine dynamische Website integrieren, die im Abfrage-String Parameter erwartet.

Das Python-Modul urllib enthält die Funktion urlencode. Diese erwartet ein Dictionary mit Schlüssel/Wert-Paaren und liefert einen korrekt formatierten Abfrage-String zurück, den Sie in eine URL einbauen können. Wenn Sie z. B. ein Dictionary beliebiger Größe haben, können Sie urlencode mit dem Dictionary als Parameter aufrufen, wie hier gezeigt:

>>> from urllib import urlencode
>>> myDict = {
... "Name" : "Chris Jones",
... "Adresse" : "Woodinville, WA",
... "Lieblingszeichen" : "#, @, $ und %"
... }
>>> strUrl = urlencode(myDict)
>>> print strUrl
Adresse=Woodinville%2c+WA&Name=Chris+Jones&Lieblingszeichen=%23%2C+%40%2C+%24+und+%25

Hierbei ist strURL keine komplette URL, sondern enthält nur die Abfragedaten, die am Ende der URL stehen. Die erste Hälfte der URL muß das Protokoll sowie den Server und die Domain enthalten:

http://www.example.com/search.cgi?Adresse=Woodinville%2c+WA&Name=Chris+Jones&Lieblingszeichen=%23%2C+%40%2C+%24+und+%25

Die Funktion urlencode kümmert sich automatisch um die Übersetzung von besonderen Zeichen wie #, @, $ und % in %23%2C+%40%2C+%24+und+%25. Nicht nur die Sonderzeichen wurden konvertiert, sondern auch die Kommas und Leerzeichen wurden in ihre hexadezimalen Werte konvertiert.

Codieren von URLs

Die Funktion quote aus urllib nimmt bei einem einzelnen Daten-String die notwendige Codierung bezüglich urlencode mit einem Dictionary als Parameter vor. Der Hauptunterschied ist, daß quote nicht automatisch Schlüssel/Wert-Paare aus dem Dictionary generiert. Die quote-Funktion existiert, damit ein einzelner String in eine URL-gerechte Syntax konvertiert werden kann. Wenn Ihre URL z. B. aus "http://www.example.com/addQuotation.cgi?myquote=" besteht, und Sie müssen da einen Wert hinzufügen, so daß Sie anschließend wieder eine korrekte URL haben, könnten Sie die Funktion quote benutzen, um ihn zu codieren:

>>> from urllib import quote
>>> quote('Zitat: "Ich denke, also bin ich."')
'Zitat%3A%20%22Ich%20denke%2C%20also%20bin%20ich.%22'

Am wichtigsten ist vielleicht, sich zu merken, daß mit quote ein einzelner String codiert werden sollte, aber kein Schlüssel/Wert-Paar. Bei jedem key=value-Paar sollte nur der Wert mit der quote-Funktion codiert sein. Wenn Sie den Teil myquote= (oder den Schlüssel) des Abfrage-Strings beim Aufruf der quote-Funktion mitnähmen, würde das Gleichheitszeichen ebenfalls codiert, was die URL wertlos machen würde.

Decodieren von URLs

Was in eine Richtung geht, muß auch in die andere funktionieren. Wenn Sie in Ihren Programmen URLs codieren, stehen die Chancen gut, daß Sie früher oder später auch einmal eine decodieren müssen. Die Funktion unquote aus urllib nimmt einen codierten String (z. B. jenen mit quote erzeugten) und gibt die decodierte Version davon zurück:

>>> from urllib import unquote
>>> unquote('Zitat%3A%20%22Ich%20denke%2C%20also%20bin%20ich.%22')
'Zitat: "Ich denke, also bin ich."'

Wenn Sie URLs programmatisch zusammenbauen und zerlegen, folgt daraus, daß es auch Sinn machen muß, damit eine Verbindung herzustellen.

  

<< 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