Formular in python ?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Anfanger
User
Beiträge: 4
Registriert: Dienstag 27. Februar 2007, 21:15

Hallo. Ich bin der Anfangere, wenn es um Python geht. Ich lese viel FAQ und Tutorials, und ich finde keine Information uber Formular in python + gui.

Ich mochte euch fragen, ob dieses moglich ist:

ZB. Ich habe den Formular auf der Seite. Er sieht so:
<form action="http://www.meineseite.cz/login.php" method="post">
Passwort: <input type="text" name="passwrd">
<input type="submit" value="enter"></form>
Kann man mir jemand die Code schreiben, wie das in python + pyQt (oder andere GUI) sieht ? Also: python + gui + formular + post ?

Danke im Voraus

PS: Sory fur mein Deutsch, aber ich bin kein Deutscher ;]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ahoj Anfanger, willkommen im Forum!

Irgendwie habe ich nicht ganz verstanden was du planst - eine GUI in der man ein Passwortfeld angeben kann, dass dann per POST an einen Server geschickt wird? Oder soll es direkt HTML-Code anzeigen? Oder, oder oder?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Anfanger hat geschrieben:

Code: Alles auswählen

<form action="http://www.meineseite.cz/login.php" method="post"> 
Passwort: <input type="text" name="passwrd">  
<input type="submit" value="enter"></form>
Kann man mir jemand die Code schreiben, wie das in python + pyQt (oder andere GUI) sieht ? Also: python + gui + formular + post ?
Hallo Anfaenger!

Formulare, wie du oben eines aufgezeigt hast, sind in HTML (Hypertext Markup Language) geschrieben und werden von Browsern wie z.B. dem Mozilla Firefox oder dem Internet Explorer interpretiert und angezeigt. Formulare können ausgefüllt werden. Diese Daten werden normalerweise an einen Internetserver weitergeleitet. Dieser gibt dann wieder HTML zurück, welches der Browser anzeigt.

Das ist die Welt des "World Wide Web" und hat mit GUI-Toolkits wie pyQt oder wxPython NICHTS zu tun.

Mit wxPython oder anderen GUI-Toolkits erstellst du Programmoberflächen, die du als Anwendungen (Applications) wie z.B. OpenOffice.org oder Microsoft Word kennst.

Jetzt stellen sich die Fragen: Was willst du machen? Kannst du dein Problem anders erklären?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Anfanger
User
Beiträge: 4
Registriert: Dienstag 27. Februar 2007, 21:15

Formulare, wie du oben eines aufgezeigt hast, sind in HTML (Hypertext Markup Language) geschrieben und werden von Browsern wie z.B. dem Mozilla Firefox oder dem Internet Explorer interpretiert und angezeigt.
Ahh, gerold, ich weiss, dass dieses Code in HTML geschrieben ist ;]
Mit wxPython oder anderen GUI-Toolkits erstellst du Programmoberflächen, die du als Anwendungen (Applications) wie z.B. OpenOffice.org oder Microsoft Word kennst.
ja, ich weiss ....

@gerold, ich sehe, dass du mich schlecht verstehst (sicher deshalb, dass mein Deutsch nicht so gut ist und ich habe eine Probleme mit der Beschreibung, was ich eigentlich machen will);]

@Leonidas: ja, ich mochte eigentlich dieses machen, also:
"eine GUI in der man ein Passwortfeld angeben kann, dass dann per POST an einen Server geschickt wird?"

Ist das in python moglich ??

Anfanger ;]

Btw. Ich grusse euch auch ;]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anfanger hat geschrieben:@Leonidas: ja, ich mochte eigentlich dieses machen, also:
"eine GUI in der man ein Passwortfeld angeben kann, dass dann per POST an einen Server geschickt wird?"

Ist das in python moglich ??
Ja, ist es. Nur wenn der Browser Daten per POST sendet, wird vom Server eine Antwort in HTML zurückgegeben. Wo soll diese Antwort angezeigt werden? Oder soll sie gar nicht angezeigt werden?

P.S.: Wenn es dir leichter fällt kannst du auch in Englisch schreiben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Anfanger
User
Beiträge: 4
Registriert: Dienstag 27. Februar 2007, 21:15

Ist das in python moglich ??
Nur wenn der Browser Daten per POST sendet, wird vom Server eine Antwort in HTML zurückgegeben. Wo soll diese Antwort angezeigt werden? Oder soll sie gar nicht angezeigt werden?
Nicht angezeigt ;] Ich mochte nur wissen, ob das in python moglich ist, und mochte euch um einfache Code bieten ;]

Anfanger
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Anfanger hat geschrieben:Nicht angezeigt ;] Ich mochte nur wissen, ob das in python moglich ist, und mochte euch um einfache Code bieten ;]
Hallo Anfanger!

Ja, das ist für Python kein Problem.

Mit dem Modul ``urllib2`` kannst du recht einfach so einen POST-Request absenden.

http://docs.python.org/lib/module-urllib2.html

Mit wxPython bekommst du z.B. so einen Passwort-Dialog:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


app = wx.PySimpleApp()
password = wx.GetPasswordFromUser(
    u"Bitte geben Sie das Passwort ein"
)
print password
Mit anderen GUI-Toolkits wird es wahrscheinlich so ähnlich sein.

mfg
Gerold
:-)

Edit: Ich habe das Beispiel ein wenig aufbereitet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx
import urllib
import urllib2

wx.SetDefaultPyEncoding("iso-8859-1")


app = wx.PySimpleApp()
password = wx.GetPasswordFromUser(
    u"Bitte geben Sie das Passwort ein"
)

response = urllib2.urlopen(
    "http://gerold.bcom.at/", 
    urllib.urlencode(
        {
            "username": "EinName",
            "password": password,
        }
    )
)
print response.read()
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Anfanger
User
Beiträge: 4
Registriert: Dienstag 27. Februar 2007, 21:15

@gerold: Vielen Dank ;] Eigentlich um dieses geht mir ;] Nochmal ich danke dir (und Leonidas;]) fur die Hilfe.

Ich sehe, dass dieses Forum die beginnenden Benutzer hilft ;] Wenn ich zB. in dem polnischem oder tschechischem Forum schrieb, das alle sagen mir, damit ich auf Google suche ;[ Ich habe euer Forum durchgeblickt und ich freue mich sehr, weil ich sehe, dass ich hier viele spannende Informationen finde ;]

Super Forum !

Anfanger
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Anfanger hat geschrieben:@gerold: Vielen Dank ;] Eigentlich um dieses geht mir ;] Nochmal ich danke dir (und Leonidas;]) fur die Hilfe.

Ich sehe, dass dieses Forum die beginnenden Benutzer hilft ;] Wenn ich zB. in dem polnischem oder tschechischem Forum schrieb, das alle sagen mir, damit ich auf Google suche ;[ Ich habe euer Forum durchgeblickt und ich freue mich sehr, weil ich sehe, dass ich hier viele spannende Informationen finde ;]

Super Forum !

Anfanger
Da sieht man mal wieder, was fuer nette Menschen die Pythonprogrammierer in Deutschland doch sind :roll:

Gut das er sich nicht in anderen deutschen Foren (ich nenn mal keine Namen) verirrt hat, wie zB diese GamerForen... also die "Massenforen" allgemein.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Ist da ein Bug im Forum? Bei diesem Thread wird in der (web-programmierungs-)Liste angezeigt, dass es noch keine Antworten gaebe?? Oder ist das nur so, weil es verschoben ist?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

nkoehring hat geschrieben:Oder ist das nur so, weil es verschoben ist?
Genau, das ist der Grund.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sysrq1
User
Beiträge: 8
Registriert: Donnerstag 15. März 2007, 17:45

Juhu, endlich habe ich ein gutes python-forum gefunden :)

Ich habe im Grunde genau das selbe vor. Ich habe das obere Codebeispiel benutzt, nur leider wird mir dann eine Fehlermeldung zurückgegeben.

Ich möchte von der Seite www.onvista.de aktuelle Börsendaten abrufen und dann automatisch auswerten lassen. Dazu habe am Anfang zu Testzwecken diees kleine python-Programm geschrieben:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*- 

import urllib
import urllib2

response = urllib2.urlopen(
    "http://www.onvista.de/suche.html",
    urllib.urlencode({"SEARCH_VALUE": 'DE000555750'})
)
print response.read()
Dass das post-feld den Namen 'SEARCH_VALUE' trägt, habe ich mit einer kleinen Analyse des HTML-Codes herausgefunden.

Beim ausüfhren erscheint aber leider dieser fehler hir

Code: Alles auswählen

Traceback (most recent call last):
  File "./onvista.py", line 9, in ?
    urllib.urlencode({"SEARCH_VALUE": 'DE000555750'})
  File "/usr/lib/python2.4/urllib2.py", line 130, in urlopen
    return _opener.open(url, data)
  File "/usr/lib/python2.4/urllib2.py", line 364, in open
    response = meth(req, response)
  File "/usr/lib/python2.4/urllib2.py", line 471, in http_response
    response = self.parent.error(
  File "/usr/lib/python2.4/urllib2.py", line 402, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.4/urllib2.py", line 480, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
Was ist hier schief gelaufen? Was muss ich tun, damit der Code funktioniert?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Ich glaub die Seite will nen User-Agent oder so was in die Richtung sehen, im Firefox geht es ganz normal...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

apollo13 hat geschrieben:Ich glaub die Seite will nen User-Agent oder so was in die Richtung sehen
Hi!

Genau das ist es auch:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import urllib
import urllib2

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
response = opener.open(
    "http://www.onvista.de/suche.html", 
    urllib.urlencode({"SEARCH_VALUE": 'DE000555750'})
)
print response.read()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sysrq1
User
Beiträge: 8
Registriert: Donnerstag 15. März 2007, 17:45

Schön, der Code funktionert jetzt. Jetzt kann ich darauf aufbauen und die extrahieren.

Vielen Dank !!! :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

apollo13 hat geschrieben:Ich glaub die Seite will nen User-Agent oder so was in die Richtung sehen
Das hat vermutlich auch einen Grund: die wollen nicht, dass Scraper kommen und die Informationen runterziehen.
Es kann sein, dass du die Geschäftsbedingungen der Webseite verletzt, wenn du den Useragent fälscht um an die Daten zu kommen. Google verbietet es ja beispielsweise ausdrücklich ihre Seiten zu scrapen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sysrq1
User
Beiträge: 8
Registriert: Donnerstag 15. März 2007, 17:45

Ich versuche mich noch mehr in die urllib2 usw. einzuarbeiten und habe mir dazu unter anderem die 'Python Library Reference' angesehen.

Hier wird z.B. die urllib2 beschrieben 'http://docs.python.org/lib/module-urllib2.html'.

Ich finde die Dokumentation aber insgesamt sehr verwirrent: von anderen Programmiersprachen-Dokumentationen bin ich es gewohnt, dass u.a. Rückgabetypen angegeben werden. Hier fehlt das aber völlig. Z.B. weiss ich nach einem 'response = opener.open("http://www.wieistmeineip.de/")' nicht genau was das 'response' genau ist und was es dann für Fähigkeiten hat. Lese ich die Dokumentation etwa falsch?

Aber zurück zu meinem eigentlichen Problem. Ich habe hier nun folgendes kleine Programm, den addHeader habe ich kurz wegen Fehlersuche auskommentiert:

Code: Alles auswählen

#!/usr/bin/env python

import urllib2

proxy_handler = urllib2.ProxyHandler({'http':'164.58.28.250'})
opener = urllib2.build_opener(proxy_handler)
#opener.addheaders = [('User-agent','Mozilla/5.0')]

response = opener.open("http://www.wieistmeineip.de/")
print response.read()
Für mich sieht der Code durchaus logisch aus: ich setze einen Proxy fest und rufe dann die angegebene website auf, wobei die Anfrage dann über den Proxy-Server läuft. Nur leider erscheint folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "./onvista.py", line 11, in ?
    response = opener.open("http://www.wieistmeineip.de/")
  File "/usr/lib/python2.4/urllib2.py", line 358, in open
    response = self._open(req, data)
  File "/usr/lib/python2.4/urllib2.py", line 376, in _open
    '_open', req)
  File "/usr/lib/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.4/urllib2.py", line 573, in <lambda>
    lambda r, proxy=url, type=type, meth=self.proxy_open: \
  File "/usr/lib/python2.4/urllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required
Es wird ein 'iterable argument' erwartet bzw. benötig? Wer oder Was genau braucht so was und wieso? Habe ich etwa an einem Ort wo eine Liste hinkommt etwa fälschlicherweise einen anderen Datentyp verwendet?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

sysrq1 hat geschrieben:Z.B. weiss ich nach einem 'response = opener.open("http://www.wieistmeineip.de/")' nicht genau was das 'response' genau ist und was es dann für Fähigkeiten hat. Lese ich die Dokumentation etwa falsch?
Hi sysrq1!

Du kannst dir jederzeit Informationen über ein Objekt ausgeben lassen. Deshalb habe ich immer auch eine Python-Shell (in meinem Fall "pyShell" aus dem wxPython-Demopaket) zur Hand.

Code: Alles auswählen

>>> import urllib2
>>> help(urllib2.build_opener)
Help on function build_opener in module urllib2:

build_opener(*handlers)
    Create an opener object from a list of handlers.
    
    The opener will use several default handlers, including support
    for HTTP and FTP.
    
    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.

>>> opener = urllib2.build_opener()
>>> help(opener)
Help on instance of OpenerDirector in module urllib2 object:

class instance(object)
 |  instance(class[, dict])
 |  
 |  Create an instance without calling its __init__() method.
 |  The class must be a classic class.
 |  If present, dict must be a dictionary or None.
 |  
 |  Methods defined here:
 |  
 |  __abs__(...)
 |      x.__abs__() <==> abs(x)
 |  
 |  __add__(...)
 |      x.__add__(y) <==> x+y
 |  
 |  __and__(...)
 |      x.__and__(y) <==> x&y
 |  
 |  __call__(...)
 |      x.__call__(...) <==> x(...)
 |  
 |  __cmp__(...)
 |      x.__cmp__(y) <==> cmp(x,y)
 |  
 |  __coerce__(...)
 |      x.__coerce__(y) <==> coerce(x, y)
 |  
 |  __contains__(...)
 |      x.__contains__(y) <==> y in x
 |  
 |  __delattr__(...)
 |      x.__delattr__('name') <==> del x.name
 |  
 |  __delitem__(...)
 |      x.__delitem__(y) <==> del x[y]
 |  
 |  __delslice__(...)
 |      x.__delslice__(i, j) <==> del x[i:j]
 |      
 |      Use of negative indices is not supported.
 |  
 |  __div__(...)
 |      x.__div__(y) <==> x/y
 |  
 |  __divmod__(...)
 |      x.__divmod__(y) <==> divmod(x, y)
 |  
 |  __eq__(...)
 |      x.__eq__(y) <==> x==y
 |  
 |  __float__(...)
 |      x.__float__() <==> float(x)
 |  
 |  __floordiv__(...)
 |      x.__floordiv__(y) <==> x//y
 |  
 |  __ge__(...)
 |      x.__ge__(y) <==> x>=y
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __getslice__(...)
 |      x.__getslice__(i, j) <==> x[i:j]
 |      
 |      Use of negative indices is not supported.
 |  
 |  __gt__(...)
 |      x.__gt__(y) <==> x>y
 |  
 |  __hash__(...)
 |      x.__hash__() <==> hash(x)
 |  
 |  __hex__(...)
 |      x.__hex__() <==> hex(x)
 |  
 |  __iadd__(...)
 |      x.__iadd__(y) <==> x+y
 |  
 |  __iand__(...)
 |      x.__iand__(y) <==> x&y
 |  
 |  __idiv__(...)
 |      x.__idiv__(y) <==> x/y
 |  
 |  __ifloordiv__(...)
 |      x.__ifloordiv__(y) <==> x//y
 |  
 |  __ilshift__(...)
 |      x.__ilshift__(y) <==> x<<y
 |  
 |  __imod__(...)
 |      x.__imod__(y) <==> x%y
 |  
 |  __imul__(...)
 |      x.__imul__(y) <==> x*y
 |  
 |  __int__(...)
 |      x.__int__() <==> int(x)
 |  
 |  __invert__(...)
 |      x.__invert__() <==> ~x
 |  
 |  __ior__(...)
 |      x.__ior__(y) <==> x|y
 |  
 |  __ipow__(...)
 |      x.__ipow__(y) <==> x**y
 |  
 |  __irshift__(...)
 |      x.__irshift__(y) <==> x>>y
 |  
 |  __isub__(...)
 |      x.__isub__(y) <==> x-y
 |  
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |  
 |  __itruediv__(...)
 |      x.__itruediv__(y) <==> x/y
 |  
 |  __ixor__(...)
 |      x.__ixor__(y) <==> x^y
 |  
 |  __le__(...)
 |      x.__le__(y) <==> x<=y
 |  
 |  __len__(...)
 |      x.__len__() <==> len(x)
 |  
 |  __long__(...)
 |      x.__long__() <==> long(x)
 |  
 |  __lshift__(...)
 |      x.__lshift__(y) <==> x<<y
 |  
 |  __lt__(...)
 |      x.__lt__(y) <==> x<y
 |  
 |  __mod__(...)
 |      x.__mod__(y) <==> x%y
 |  
 |  __mul__(...)
 |      x.__mul__(y) <==> x*y
 |  
 |  __ne__(...)
 |      x.__ne__(y) <==> x!=y
 |  
 |  __neg__(...)
 |      x.__neg__() <==> -x
 |  
 |  __nonzero__(...)
 |      x.__nonzero__() <==> x != 0
 |  
 |  __oct__(...)
 |      x.__oct__() <==> oct(x)
 |  
 |  __or__(...)
 |      x.__or__(y) <==> x|y
 |  
 |  __pos__(...)
 |      x.__pos__() <==> +x
 |  
 |  __pow__(...)
 |      x.__pow__(y[, z]) <==> pow(x, y[, z])
 |  
 |  __radd__(...)
 |      x.__radd__(y) <==> y+x
 |  
 |  __rand__(...)
 |      x.__rand__(y) <==> y&x
 |  
 |  __rdiv__(...)
 |      x.__rdiv__(y) <==> y/x
 |  
 |  __rdivmod__(...)
 |      x.__rdivmod__(y) <==> divmod(y, x)
 |  
 |  __repr__(...)
 |      x.__repr__() <==> repr(x)
 |  
 |  __rfloordiv__(...)
 |      x.__rfloordiv__(y) <==> y//x
 |  
 |  __rlshift__(...)
 |      x.__rlshift__(y) <==> y<<x
 |  
 |  __rmod__(...)
 |      x.__rmod__(y) <==> y%x
 |  
 |  __rmul__(...)
 |      x.__rmul__(y) <==> y*x
 |  
 |  __ror__(...)
 |      x.__ror__(y) <==> y|x
 |  
 |  __rpow__(...)
 |      y.__rpow__(x[, z]) <==> pow(x, y[, z])
 |  
 |  __rrshift__(...)
 |      x.__rrshift__(y) <==> y>>x
 |  
 |  __rshift__(...)
 |      x.__rshift__(y) <==> x>>y
 |  
 |  __rsub__(...)
 |      x.__rsub__(y) <==> y-x
 |  
 |  __rtruediv__(...)
 |      x.__rtruediv__(y) <==> y/x
 |  
 |  __rxor__(...)
 |      x.__rxor__(y) <==> y^x
 |  
 |  __setattr__(...)
 |      x.__setattr__('name', value) <==> x.name = value
 |  
 |  __setitem__(...)
 |      x.__setitem__(i, y) <==> x[i]=y
 |  
 |  __setslice__(...)
 |      x.__setslice__(i, j, y) <==> x[i:j]=y
 |      
 |      Use  of negative indices is not supported.
 |  
 |  __str__(...)
 |      x.__str__() <==> str(x)
 |  
 |  __sub__(...)
 |      x.__sub__(y) <==> x-y
 |  
 |  __truediv__(...)
 |      x.__truediv__(y) <==> x/y
 |  
 |  __xor__(...)
 |      x.__xor__(y) <==> x^y
 |  
 |  next(...)
 |      x.next() -> the next value, or raise StopIteration
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T

>>> help(urllib2.OpenerDirector)
Help on class OpenerDirector in module urllib2:

class OpenerDirector
 |  Methods defined here:
 |  
 |  __init__(self)
 |  
 |  add_handler(self, handler)
 |  
 |  close(self)
 |  
 |  error(self, proto, *args)
 |  
 |  open(self, fullurl, data=None)

>>> 
Mit ``help()`` bekommst du den Docstring, erwartete Parameter und oft auch den Rückgabetyp.

Mit ``dir()`` bekommst du eine Auflistung der Methoden und Attribute.

Mit ``type()`` bekommst du den Objekttyp zurück.

Mit diesen Informationen lässt sich meist schnell alles Wichtige über ein Objekt herausfinden.

Zu deinem Problem: In der Ausgabe von ``help(urllib2.build_opener)`` findest du "Create an opener object from a list of handlers.".
Du musst also eine Liste übergeben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten