urllib(2) und Sonderzeichen

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
Ovonuk
User
Beiträge: 1
Registriert: Sonntag 29. März 2009, 00:05

Sonntag 29. März 2009, 00:21

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
DasIch
User
Beiträge: 2437
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sonntag 29. März 2009, 00:24

Nimm einen HTML Parser wie lxml.
BlackJack

Sonntag 29. März 2009, 07:19

@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]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 29. März 2009, 10:05

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
BlackJack

Sonntag 29. März 2009, 13:04

@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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 1. April 2009, 09:23

Ich auch. Du hast recht.
Antworten