Formular in python ?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
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