Pergunta

Eu escrevi isso para tentar fazer login em um fórum (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()

No entanto, quando eu o corro, ele 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

Alguma idéia de como resolver isso?

editar

Adicionar uma vírgula entre a string e os dados fornece esse erro em vez disso

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

Eu mudei o código do 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()

Isso não joga nenhuma mensagem de erro, apenas fornece 3 linhas em branco. É porque estou tentando ler a página de login que desaparece após o login. Se sim, como faço para exibir o índice que é o que deve aparecer após o acertar de login.

Foi útil?

Solução

Sua linha

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

é semanticamente inválido python. Presumivelmente você quis dizer

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

que tem uma vírgula que separa os argumentos. No entanto, o que você realmente quer é simplesmente

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

Sem tentar envolver o Logindata em uma lista e usar a versão mais atualizada do Urlopen é a biblioteca URLLIB2.

Outras dicas

Que tal usar uma vírgula entre a string,"http:..." e os dados urléticos, [logindata]?

Sua sequência de URL não deveria ser

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

Mas

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

Eu acho que, porque [] é para matriz e exige um número inteiro. Eu posso estar errado porque não fiz muito python.

Se você fizer um tipo de logindata, poderá ver que é uma string:

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

Colocá -lo entre colchetes ([]) coloca em um contexto de lista, o que não é o que você deseja.

Isso seria mais fácil com o módulo "mecanizar" de alto nível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top