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

gzip encoding

Beitragvon Crazed » Sonntag 18. Mai 2008, 11:51

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

Beitragvon Trundle » Sonntag 18. Mai 2008, 12:16

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

Beitragvon Crazed » Sonntag 18. Mai 2008, 12:51

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

Beitragvon Trundle » Sonntag 18. Mai 2008, 13:04

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

Beitragvon Crazed » Sonntag 18. Mai 2008, 13:22

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

Beitragvon Trundle » Sonntag 18. Mai 2008, 13:32

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

Beitragvon Crazed » Sonntag 18. Mai 2008, 13:40

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 18. Mai 2008, 13:42

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

Beitragvon Crazed » Sonntag 18. Mai 2008, 13: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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 18. Mai 2008, 13:46

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

Beitragvon Crazed » Sonntag 18. Mai 2008, 13:55

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 18. Mai 2008, 14:37

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder