Seite 1 von 2

inhalt einer internetseite abrufen

Verfasst: Freitag 5. Mai 2006, 15:34
von Abooya
hallo, ich beschäftige mich noch nicht lange mit python, und hätte dementsprechend eine dumme frage :P :
Wenn ich einen httpsocket geöffnet und eine anfrage ausgeführt habe,sieht mein code in etwa so aus:

Code: Alles auswählen

import httplib, Image, os, random

socket = httplib.HTTPConnection('lalilu.de', 80)

header = {'User_Agent': 'Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)'}

socket.request('GET', '/abc.php?xyz=123', '', header)
response = socket.getresponse()
wie kann ich jetzt aber den inhalt der seite abc.php?xyz=123 abrufen?

ich wäre dankbar, wenn jemand einem noob wie mir helfen könnte . :wink:

mit freundlichen Grüssen
Abooya

Verfasst: Freitag 5. Mai 2006, 15:39
von ryu
Hi,
das müsste so am einfachsten gehen:

Code: Alles auswählen

>>> from urllib import urlopen
>>> page = urlopen('http://google.de')
>>> print(page.read())
<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title>...
Alternativ hat auch dein "response" Objekt eine Methode namens "read", mit der du den Inhalt auslesen kannst.

Chris

Verfasst: Freitag 5. Mai 2006, 16:01
von Abooya
vielen dank, ich habe es gerade in der shell ausprobier und es hat super funktioniert. :)
jetzt hätte ich aber noch eine frage. in der seite, die ich auslese, ist die url einer weiteren seite, wenn ich allerdings versuche diese auszulesen, bekomme ich folgenden error:

Code: Alles auswählen

<bound method _fileobject.read of <socket._fileobject object at 0x00A65590
woran könnte das liegen? hat es etwas damit zu tun, dass auf der seite serverseitig weitergeleitet wird?
Schonmal danke im vorraus!

// Die Bytekennzeichnung variiert natürlich
mfg
Abooya

Verfasst: Freitag 5. Mai 2006, 16:08
von ryu
Du hast vermutlich

Code: Alles auswählen

obj.method
darum wurde nur das Objekt was sich hinter der Methode verbirgt angezeigt. Um die Methode richtig aufzurufen, müsstest du

Code: Alles auswählen

obj.method()
eingeben.

Verfasst: Freitag 5. Mai 2006, 16:11
von Abooya
ja, du hast recht. nochmals vielen dank, jetzt funktioniert alles :D
// oder zumindest fast alles :(
ich schaffe es jetzt zwar, die seite anzeigen zu lassen, allerdings meint er nun, ich sollte Cookies zulassen, damit er die Php-Sessionid drin ablegen kann. die frage ist nur: wie moduliere ich in python cookies?
es wäre wirklich supernett, wenn mir nochmal jemand helfen könnte.

mfg
Abooya

Verfasst: Freitag 5. Mai 2006, 17:35
von Leonidas
Abooya hat geschrieben:wie moduliere ich in python cookies?
Es gibt die Module Cookie und cookielib.

Verfasst: Freitag 5. Mai 2006, 17:55
von gerold
Abooya hat geschrieben:ich sollte Cookies zulassen, damit er die Php-Sessionid drin ablegen kann.
Hi Abooya!

Probiers damit: http://wwwsearch.sourceforge.net/ClientCookie/

mfg
Gerold
:-)

Verfasst: Freitag 5. Mai 2006, 18:31
von Abooya
ich habe jetzt einen bekannten gefragt, und er meinte, dass ich einfach

Code: Alles auswählen

header['cookie'] = 'PHPSESSID=' + sessid
in verbindung mit der socket-variante machen soll. ich probiers mal aus.

// btw: gibt es in Python etwas wie 'getChar()' in C?

Verfasst: Freitag 5. Mai 2006, 19:18
von Leonidas
Abooya hat geschrieben:gibt es in Python etwas wie 'getChar()' in C?
Für die C-Unkundigen: was tut getChar()?

Verfasst: Freitag 5. Mai 2006, 19:39
von jens
Abooya hat geschrieben:

Code: Alles auswählen

header['cookie'] = 'PHPSESSID=' + sessid

// btw: gibt es in Python etwas wie 'getChar()' in C?
String-Operation ist nicht gemeint, oder?

Code: Alles auswählen

header['cookie'] = 'PHPSESSID= %s'  % sessid
Oder vielleicht nur ASCII-Zeichen extrahieren:
http://www.python-forum.de/topic-5861.html

Verfasst: Freitag 5. Mai 2006, 19:43
von Abooya
getChar() hält das Programm einfach solange an, bis eine taste gedrückt wird :wink:

Verfasst: Freitag 5. Mai 2006, 19:44
von jens
Dafür reicht ein raw_input() Allerdings muß man dann ENTER drücken... Was anderes kenn ich allerdings spontan nicht... Wobei, vielleicht sys.stdin.read(1) ???

Verfasst: Freitag 5. Mai 2006, 19:52
von icepacker
Abooya hat geschrieben:getChar() hält das Programm einfach solange an, bis eine taste gedrückt wird :wink:
:roll: *schüttel*

1. Heißt es getchar()
2. Liest die Funktion ein Zeichen von der Standardeingabe und gibt den ASCII
Wert des Zeichens zurück.

Verfasst: Freitag 5. Mai 2006, 19:54
von Leonidas
jens hat geschrieben:Was anderes kenn ich allerdings spontan nicht...
Aber ich: msvcrt.getch() ;)

Verfasst: Freitag 5. Mai 2006, 19:55
von jens
Leonidas hat geschrieben:msvcrt.getch() ;)
Availability: Windows.

Verfasst: Freitag 5. Mai 2006, 20:05
von Leonidas
jens hat geschrieben:
Leonidas hat geschrieben:msvcrt.getch() ;)
Availability: Windows.
Wo steht denn dass er es für Unix braucht?

Verfasst: Freitag 5. Mai 2006, 20:09
von Abooya
ich bin bekennender win XP-nutzer
@icepacker: also ich benutze es immer nur zum anhalten :lol:

Verfasst: Freitag 5. Mai 2006, 20:19
von jens
Aber gerade bei solchen Kleinigkeiten würde ich dann besser auf das portable raw_input() oder sys.stdin.read(1) setzten ;)
Wobei ich beim letzteren nicht weiß, ob es das gewollte auch wirklich tut... Kann das mal jemand testen???

Verfasst: Freitag 5. Mai 2006, 20:34
von Leonidas
jens hat geschrieben:Wobei ich beim letzteren nicht weiß, ob es das gewollte auch wirklich tut... Kann das mal jemand testen???
Nein tuts nicht. Du kannst so lange tippen wie du willst, aber es wird nur das erste Byte welches du eingetippt hast gelesen und zurückgegeben, bis du Enter drückst. Bei weiteren Aufrufen werden die anderen Bytes die du eingegeben hast ausgegeben (also wird sozusagen der stdin-Puffer abgearbeitet).

Unter Linux gibt es getch() auch, das wird dann über Curses abgewickelt.

Zu guter Letzt ncoh etwas, was cross platform geht.

Verfasst: Samstag 6. Mai 2006, 11:08
von Abooya
ok, nochmal vielen dank an alle!
jetzt habe ich noch eine letzte frage (wirklich die letzte :wink: )
und zwar würde ich gerne eine weitere internetadresse aus dem inhalt auslesen, die mir die nummer der entsprechenden adresse ausgibt.
Beispiel:
Bei

Code: Alles auswählen

funktion("<frame src='http://www.google.com'></frame>","http://*'>")
sollte er mir 10, 33 ausgeben (falls ich mich nicht verzählt habe :P)
bei den python docs finde ich aber nur funktionen, die mir die bytenummer zurückgeben :(
achso, und ausserdem fände ich es nett, wenn mir jemand gleich noch eine funktion zum splitten von strings geben könnte.

mit hoffenden Grüssen
Abooya