gzip encoding

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
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das [mod]gzip[/mod]-Modul anstelle des zlib-Moduls verwenden.
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Hey danke.
Jetzt habe ich nur noch ein kleines Problem.
Ich muss wenn ich gzip.open verwenden will den ganzen content zwischenspeichern oder?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Da hilft StringIO bzw. cStringIO weiter.
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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)
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Zuletzt geändert von Leonidas am Sonntag 18. Mai 2008, 13:44, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten