Domanda

Ho scritto questo per provare ad accedere a 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()

Comunque quando lo eseguo viene fuori;

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

qualche idea su come risolverlo?

modifica

l'aggiunta di una virgola tra la stringa e i dati genera invece questo errore

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

Ho cambiato il codice da quello a cui era;

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

Questo non genera alcun messaggio di errore, dà solo 3 righe vuote. È perché sto provando a leggere dalla pagina di accesso che scompare dopo aver effettuato l'accesso. In tal caso, come posso ottenerlo per visualizzare l'indice che è quello che dovrebbe apparire dopo aver colpito il login.

È stato utile?

Soluzione

La tua linea

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

è Python semanticamente non valido. Presumibilmente intendevi

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

che ha una virgola che separa gli argomenti. Tuttavia, ciò che REALMENTE desideri è semplicemente

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

senza cercare di racchiudere i logindata in un elenco e utilizzare la versione più aggiornata di urlopen è la libreria urllib2.

Altri suggerimenti

Che ne dici di usare una virgola tra la stringa, " http: ... " e i dati urlencoded, [logindata] ?

La tua stringa URL non dovrebbe essere

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

Ma

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

Penso, perché [] è per array e richiede un numero intero. Potrei sbagliarmi perché non ho fatto molto Python.

Se fai un tipo su logindata, puoi vedere che è una stringa:

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

Mettendolo tra parentesi ([]) lo inserisce in un contesto di elenco, che non è quello che desideri.

Questo sarebbe più facile con l'alto livello di "meccanizzazione" modulo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top