Pregunta

He escrito esto para intentar iniciar sesión en un foro (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()

Sin embargo, cuando lo ejecuto aparece;

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

alguna idea sobre cómo resolver esto?

edit

agregar una coma entre la cadena y los datos genera este error

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

He cambiado el código de lo que 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()

Esto no arroja ningún mensaje de error, solo da 3 líneas en blanco. Esto se debe a que estoy tratando de leer desde la página de inicio de sesión que desaparece después de iniciar sesión. Si es así, ¿cómo hago para que muestre el índice que es lo que debería aparecer después de presionar el inicio de sesión?

¿Fue útil?

Solución

Tu línea

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

es Python semánticamente inválido. Presumiblemente quisiste decir

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

que tiene una coma que separa los argumentos. Sin embargo, lo que REALMENTE quiere es simplemente

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

sin tratar de incluir datos de inicio de sesión en una lista y usar la versión más actualizada de urlopen es la biblioteca urllib2.

Otros consejos

¿Qué tal usar una coma entre la cadena, " http: ... " y los datos codificados por urlen, [logindata] ?

Su cadena de URL no debe ser

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

Pero

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

Creo, porque [] es para una matriz y requiere un número entero. Podría estar equivocado porque no he hecho mucho Python.

Si escribe un tipo de datos de inicio de sesión, puede ver que es una cadena:

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

Ponerlo entre paréntesis ([]) lo pone en un contexto de lista, que no es lo que quieres.

Esto sería más fácil con la mecanización de alto nivel módulo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top