Question

J'ai écrit ceci pour essayer de vous connecter sur un 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()

Cependant, lorsque je l'exécute, il se présente avec;

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

des idées sur la façon de résoudre ce problème?

modifier

ajouter une virgule entre la chaîne et les données donne cette erreur à la place

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

J'ai modifié le code par rapport à ce qu'il était;

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()

Cela ne renvoie aucun message d'erreur, il donne simplement 3 lignes vierges. Est-ce parce que j'essaie de lire la page de connexion qui disparaît après la connexion? Si tel est le cas, comment puis-je l'obtenir pour afficher l'index qui devrait apparaître après la connexion?

Était-ce utile?

La solution

Votre ligne

page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login"[logindata])

est sémantiquement invalide Python. Vous vouliez probablement dire

page = urllib.urlopen("http://www.woarl.com/board/ucp.php?mode=login", [logindata])

qui a une virgule séparant les arguments. Cependant, ce que vous voulez réellement, c’est tout simplement

page = urllib2.urlopen("http://www.woarl.com/board/ucp.php?mode=login", logindata)

sans chercher à inclure logindata dans une liste et à utiliser la version la plus récente d’urlopen, la bibliothèque urllib2.

Autres conseils

Pourquoi ne pas utiliser une virgule entre la chaîne "http: ..." et les données codées en url, [logindata] ?

Votre chaîne d'URL ne devrait pas être

"http://www.woarl.com/board/ucp.php?mode=login"[logindata]

Mais

 "http://www.woarl.com/board/ucp.php?mode=login", logindata

Je pense, car [] est pour tableau et nécessite un entier. Je peux me tromper car je n’ai pas fait beaucoup de Python.

Si vous faites un type sur logindata, vous pouvez voir qu'il s'agit d'une chaîne:

>>> import urllib
>>> logindata = urllib.urlencode({'username': 'x', 'password': 'y'})
>>> type(logindata)
<type 'str'>

Le mettre entre parenthèses ([]) le place dans un contexte de liste, ce qui n'est pas ce que vous voulez.

Cela serait plus facile avec le mécanisme "mécaniser" de haut niveau. module.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top