Seite 1 von 1

gzip encoding

Verfasst: Sonntag 18. Mai 2008, 11:51
von Crazed
Hallo,
Ich wollte folgende Seite einfach mittels der Komponente mechanize
einfach in der Konsole ausgeben. Dabei habe ich festgestellt das die seite gzip benutzt. Daraufhin habe ich zlib importiert und probiert den string zu entschlüsseln und auszugeben dann bekomme ich aber folgenden Fehler:
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
main()
File "C:\Dokumente und Einstellungen\Chris\Desktop\Python\AniDB\anidb.py", line 6, in main
answer = zlib.decompress(request.read())
error: Error -3 while decompressing data: incorrect header check
Hier der Code:

Code: Alles auswählen

import mechanize
import zlib

def main():
    request = mechanize.urlopen("http://anidb.net/perl-bin/animedb.pl?show=main")
    answer = zlib.decompress(request.read())
Ich rufe main() dann nachher einfach über die Shell auf.

Kann mir jemand helfen?

MfG,
CracKPod

Verfasst: Sonntag 18. Mai 2008, 12:16
von Trundle
Das [mod]gzip[/mod]-Modul anstelle des zlib-Moduls verwenden.

Verfasst: Sonntag 18. Mai 2008, 12:51
von Crazed
Hey danke.
Jetzt habe ich nur noch ein kleines Problem.
Ich muss wenn ich gzip.open verwenden will den ganzen content zwischenspeichern oder?

Verfasst: Sonntag 18. Mai 2008, 13:04
von Trundle
Da hilft StringIO bzw. cStringIO weiter.

Verfasst: Sonntag 18. Mai 2008, 13:22
von Crazed
Tut mir Leid :|.
Ich bekomme immer noch einen Fehler:

Code: Alles auswählen

def main():
    request = mechanize.urlopen("http://anidb.net/perl-bin/animedb.pl?show=main")
    requestbuffer = StringIO.StringIO()
    requestbuffer.write(request.read())
    answer = gzip.open(requestbuffer, 'rb')
    print answer
TypeError: coercing to Unicode: need string or buffer, instance found
TypeCast error? Aber er sagt Instanz gefunden. Liegt sicherlich daran das ich StringIO falsch verwende. Kannst du mir noch ein weiteres mal aushelfen?

Würde mich sehr freuen wenn das klappen würde.

Verfasst: Sonntag 18. Mai 2008, 13:32
von Trundle
Einfach `gzip.GzipFile` verwenden und nicht `gzip.open` und `requestbuffer` als ``fileobj``-Parameter übergeben. Und ``requestbuffer.seek(0)`` vorher machen oder die Daten gleich beim Initialisieren von `requestbuffer`übergeben.

Ergibt also:

Code: Alles auswählen

request = mechanize.urlopen("http://anidb.net/perl-bin/animedb.pl?show=main")
requestbuffer = StringIO.StringIO(request.read())
answer = gzip.GzipFile(fileobj=requestbuffer)

Verfasst: Sonntag 18. Mai 2008, 13:40
von Crazed
Vielen vielen Dank.
GzipFile hatte ich wohl in der Dokumentation übersehen.
Aber was ist ein fileobj?

Habe mich vorher nur mit c++ befasst und das auch nicht komplett.
Wäre ganz gut wenn du einen Link zu einer schnellen und guten Anfänger referenz hättest Englisch/Deutsch völlig egal.

Es gibt soviele und soviel unvollständige (Wikibook - Deutsch) wäre gut wenn du mir eine Empfehlung geben könntest.

Danke nochmal

MfG,
CracKPod

Verfasst: Sonntag 18. Mai 2008, 13:42
von Leonidas
Crazed hat geschrieben:Aber was ist ein fileobj?
Das ist der Name des vierten Parameters zu GzipFile.

Das steht übrigens für "file-like object", also etwartet es als vierten Parameter so etwas wie ``file(...)``, ``open(...)`` oder ``StringIO.StringIO(...)``.

Empfehlung: Das Tutorial auf python.org.

Verfasst: Sonntag 18. Mai 2008, 13:44
von Crazed
Achso in Python ist es möglich die vorherigen parameter zu überspringen und nur einen direkt einen wert zuzuweisen?
Dann müssten die anderen aber auch mit Werten vorbelegt sein, oder?

MfG,
CracKPod

Verfasst: Sonntag 18. Mai 2008, 13:46
von Leonidas
Crazed hat geschrieben:Achso in Python ist es möglich die vorherigen parameter zu überspringen und nur einen direkt einen wert zuzuweisen?
Dann müssten die anderen aber auch mit Werten vorbelegt sein, oder?
Ja, sind sie auch:

Code: Alles auswählen

gzip.GzipFile(self, filename=None, mode=None, compresslevel=9, fileobj=None)
(über ``self`` musst du dir keine Gedanken machen, das wird automatisch übergeben, aber lies einfach das Tutorial)

Verfasst: Sonntag 18. Mai 2008, 13:55
von Crazed
Vielen Dank leonidas!

Eine Frage die zwar etwas offtopic rutscht aber ich bin mir sicher das du mir sie trotzdem beantworten kannst.

Ist sowas möglich?:

Ein Client in python, dieser verbindet zu verschiedenen IRC-Servern, wartet auf bestimmten channels und durchsucht die Nachrichten nach einer bestimmten Syntax z.b:

file xyz added on abc @ 123

Und dann automaitsch einen dcc-dateitransfer für die Datei xyz startet?

Ich werde mir jetzt das Tutorial durchlesen. Danke für den großartigen und schnellen Support.

MfG,
CracKPod

Verfasst: Sonntag 18. Mai 2008, 14:37
von Leonidas
Crazed hat geschrieben:Ein Client in python, dieser verbindet zu verschiedenen IRC-Servern, wartet auf bestimmten channels und durchsucht die Nachrichten nach einer bestimmten Syntax z.b:

file xyz added on abc @ 123

Und dann automaitsch einen dcc-dateitransfer für die Datei xyz startet?
Ja, ist möglich. Aber für unterschiedliche Fragen bitte verschiedene Threads nutzen. Sonst bleibt es an den Moderatoren hängen, die dann zu trennen.