Python-Protokollierung in einem Forum
Frage
Ich habe das geschrieben, um zu versuchen und melden Sie sich auf ein Forum (phpBB3).
import urllib2, re
import urllib, re
logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
output = page.read()
Allerdings, wenn ich laufe es es kommt mit;
Traceback (most recent call last):
File "C:/Users/Mike/Documents/python/test urllib2", line 4, in <module>
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
TypeError: string indices must be integers
Alle Ideen, wie diese zu lösen?
Bearbeiten
Hinzufügen von einem Komma zwischen der Zeichenfolge und die Daten gibt diesen Fehler stattdessen
Traceback (most recent call last):
File "C:/Users/Mike/Documents/python/test urllib2", line 4, in <module>
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login",[logindata])
File "C:\Python25\lib\urllib.py", line 84, in urlopen
return opener.open(url, data)
File "C:\Python25\lib\urllib.py", line 192, in open
return getattr(self, name)(url, data)
File "C:\Python25\lib\urllib.py", line 327, in open_http
h.send(data)
File "C:\Python25\lib\httplib.py", line 711, in send
self.sock.sendall(str)
File "<string>", line 1, in sendall
TypeError: sendall() argument 1 must be string or read-only buffer, not list
edit2
Ich habe den Code geändert, was es war;
import urllib2, re
import urllib, re
logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
output = page.read()
Dies wirft keine Fehlermeldungen, es gibt nur drei Leerzeilen. Ist das, weil ich versuche, aus der Login-Seite zu lesen, die nach der Anmeldung verschwindet. Wenn ja, wie bekomme ich es den Index anzuzeigen, das ist das, was in nach der Kollision mit Protokoll erscheinen soll.
Lösung
Ihre Zeile
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])
ist semantisch ungültig Python. Vermutlich soll Sie
page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login", [logindata])
, die hat ein Komma, die Argumente zu trennen. Doch was Sie eigentlich wollen, ist einfach
page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)
, ohne versuchen Logindaten in eine Liste und mit der mehr up-to-date-Version von urlopen ist die urllib2 Bibliothek einzuschließen.
Andere Tipps
Wie wäre es ein Komma zwischen der Zeichenfolge, "http:..."
und die urlencoded Daten, [logindata]
?
Ihre URL-Zeichenfolge sollte nicht
"http://www.woarl.com/board/ucp.php?mode=login"[logindata]
Aber
"http://www.woarl.com/board/ucp.php?mode=login", logindata
Ich denke, da [] für Array ist und es eine ganze Zahl erfordern. Ich könnte falsch sein, weil ich nicht viel Python getan haben.
Wenn Sie einen Typen auf Logindaten tun, können Sie sehen, dass es eine Zeichenfolge ist:
>>> import urllib
>>> logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
>>> type(logindata)
<type 'str'>
Um es in Klammern ([]) bringt es auf den Listenkontext, das ist nicht das, was Sie wollen.
Dies wäre einfacher, mit dem High-Level "mechanisieren" -Modul.