Seite 1 von 1

urllib(2) und Sonderzeichen

Verfasst: Sonntag 29. März 2009, 00:21
von Ovonuk
Hallo,
ich habe folgende Funktion:

Code: Alles auswählen

# -*- coding: utf-8 -*-

def getvideoinfo(id):
    f = urllib.urlopen("http://www.imdb.de/title/" + id)
    flines=f.read().splitlines()
    genre=flines[flines.index("<h5>Genre:</h5>")+1]
    laenge=flines[flines.index("<h5>Länge:</h5>")+1]
    videoinfo=[genre,laenge]
    return videoinfo
Sie soll mit urllib Infos zu einem bestimmten Film auf der Seite www.imdb.de anzeigen. Leider wird der String bzgl. der Länge nicht auf der Seite gefunden, obwohl er vorhanden ist.
Irgendwas geht also mit den Sonderzeichen schief. Wenn ich mir die Seite ausgeben lasse, werden die Sonderzeichen nur als Fragezeichen dargestellt. Hab das ganze schon mit urllib und urllib2 probiert.

Wie kann ich nun eine Zeile mit einem Sonderzeichen in einer Webseite suchen?

Grüße, Ovonuk

Verfasst: Sonntag 29. März 2009, 00:24
von DasIch
Nimm einen HTML Parser wie lxml.

Verfasst: Sonntag 29. März 2009, 07:19
von BlackJack
@Ovonuk: Oder noch besser ein Modul, das speziell auf die IMDB zugeschnitten ist: IMDbPY.

Ansonsten solltest Du Dich mal mit Unicode und Kodierungen, und dem Unterschied zwischen Zeichen und Bytes beschäftigen. Dann sollte auch klar werden, warum das Skript so wie's jetzt ist, nicht zuverlässig etwas findet, und dass das Ganze nichts mit `urllib(2)` zu tun hat.

[wiki]Von Umlauten, Unicode und Encodings[/wiki]

Verfasst: Sonntag 29. März 2009, 10:05
von sma
Eigentlich müsste der Code sogar funktionieren. Die IMDB-Seite, die ich probehalber mal geladen habe, behauptet von sich per HTTP-EQUIV, iso-8859-1-kodiert zu sein. read() von urllib liest Bytes. Mein Python 2.5-Default-Encoding ist ASCII aber wohl großzügig genug, die ISO-8859-1-kodierten Umlaute nicht zu entfernen. Das "ä" hat im Unicode-Zeichensatz den selben Codepoint wie die ISO-8859-1-Kodierung es auf ein Byte abbildet.

Ich vermute daher, dass der Editor von Ovonuk die Datei nicht UTF-8-kodiert abgespeichert hat und daher in dem String gar kein "ä" stand. Wenn man dort "\xE4" benutzt, geht es auch im Standard-ASCII-Encoding.

Wirklich robust ist das aber alles nicht, denn HTML erlaubt auch entities, und statt "ä" könnte dort auch "&auml;" oder "&#xe4;" oder "ä" stehen. Außerdem könnte morgen die Seite auch in UTF-8 oder mit einer anderen Kodierung ausgeliefert werden, und dann stimmen die Bytes nicht mehr mit den Zeichen überein. Schließlich könnte "<h5>" auch als "<H5>" geschrieben werden und/oder Attribute bekommen.

Schließlich verletzt man die Nutzungslizenz der Seiten, wenn man sie ohne schriftliche Genehmigung von Amazon per Programm aberntet - doch das ist noch Mal ein anderes Thema.

Stefan

Verfasst: Sonntag 29. März 2009, 13:04
von BlackJack
@sma: Ich bin verwirrt. Gerade *wenn* der Quelltext als UTF-8 abgespeichert ist, kann das nicht gehen, weil ein `ä` in UTF-8 anders kodiert wird als in ISO-8859-1. Welchen Unicode-Codepoint ein `ä` hat, ist völlig schnuppe, weil der OP überhaupt kein Unicode verwendet.

Verfasst: Mittwoch 1. April 2009, 09:23
von sma
Ich auch. Du hast recht.