• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

joaoqalves

[Resolvido] Escrever num ficheiro

18 mensagens neste tópico

Boa tarde pessoal, recomecei a aprender python e quis brincar com o Kiosk (do SIGE da microIO) da minha escola e com o PycURL, pois bem: já consegui fazer o login e aceder à página de marcação de senhas, mas agora tenho todo um conjunto de html para parsar, e vi na net que a melhor maneira é utilizar a lib SGML, bem, mas para tal tenho que passar o conteúdo para um documento *.html, ou seja, escrever a resposta por parte do cURL num ficheirinho, mas não estou a conseguir fazê-lo... alguém me dá uma ideia?

import os, pycurl, sgmllib
from sgmllib import SGMLParser
#Definicao de dados gerais

USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 6.0)'
PaginaLogin = 'http://ww2.ancorensis.pt/kioskwebnew/default.asp'
DADOS_POST = 'login=xxxx&Password=yyyy&I1.x=0&I1.y=0&I1=Ok'

#Definicao do objecto

Conn = pycurl.Curl()

# Ir buscar a pagina de Login

Conn.setopt(pycurl.USERAGENT, USER_AGENT)
Conn.setopt(pycurl.FOLLOWLOCATION,1)
Conn.setopt(pycurl.COOKIE, 'Externo=N;ASPSESSIONIDQSQSRSAC=MNENNKHDDEOBJBGKGEKPEOIM')
Conn.setopt(pycurl.URL, PaginaLogin)
Conn.perform()

# Fazer o login

Conn.setopt(pycurl.POSTFIELDS, DADOS_POST)
Conn.setopt(pycurl.POST,1)
Conn.perform()

# Recepcao dos dados

Conn.setopt(pycurl.URL,'http://ww2.ancorensis.pt/kioskwebnew/calendario.asp')
html = Conn.perform()
Ficheiro = open("lolada.txt","w")
Ficheiro.writelines(html)
Ficheiro.close()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o erro? se calhar a var html não é string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o erro? se calhar a var html não é string.

Sim, provavelmente é isso :)

Traceback (most recent call last):

  File "pyKiosk.py", line 30, in <module>

    Ficheiro.write(html)

TypeError: argument 1 must be string or read-only character buffer, not None

Provavelmente, o Perform() é só um método da classe pycurl, mas como passo isso para uma string?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

file.write(str(atuavariavel))

:)

Oi, vi agora. O erro que te dá é por não ser string porque é "None". Não te está a faltar nada para cima no código? É que esse html está vazio :x

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

file.write(str(atuavariavel))

:D

Oi, vi agora. O erro que te dá é por não ser string porque é "None". Não te está a faltar nada para cima no código? É que esse html está vazio :x

LOL é assim: Conn.Perform() funciona e imprime o código da página @ consola, mas não sei se lhe posso igualar uma variável... :hmm: I'll test

Edit: Escreveu "None" no ficheiro... :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois :x Porque a variável html está vazia :x

Faz um dir aos métodos da Conn.perform() e vê se não tens um toString ou algo assim. Se tu fizeres print Conn.perform() que te aparece?

EDIT:

Cuscando o perform fui ter a isto:

RETURN VALUE

0 means everything was ok, non-zero means an error occurred as <curl/curl.h> defines. If the CURLOPT_ERRORBUFFER was set with curl_easy_setopt there will be a readable error message in the error buffer when non-zero is returned.

Tens a certeza que usaste a perform para imprimir para o ecrã o html da página?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se fizer :

print Conn.perform()

faz o print do código direitinho :hmm: , fiz

print dir(Conn.perform())

e obtive:

['__class__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__']

Já tentei usar o __str__ mas sem sucesso :)

Só me saem duques e cenas tristes :D....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cuscando o perform fui ter a isto:

Tens a certeza que usaste a perform para imprimir para o ecrã o html da página?

Sim, testei agora mesmo, é o Conn.perform() que me manda "cá para fora" o html :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Are you sure? É que tou a testar aqui e o output é tipo automático :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Are you sure? É que tou a testar aqui e o output é tipo automático :)

Sm, fazer print Conn.perform() ou Conn.perform() é igual :hmm: ... fogo... que estranho... LOL

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Faz aí print type(Conn.perform()) sff.

<type 'NoneType'>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que te está a imprimir isso não é o print mas sim o próprio método.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que te está a imprimir isso não é o print mas sim o próprio método.

Até aí já eu cheguei... eu queria era arranjar maneira (nem que fosse com uma "martelada") para isto funcionar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A única maneira "à martelada" que estou a ver, é chamares esse script de fora, com o método os.popen e captares o output... de outro script.. mas é verdadeiramente primitivo ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites


import StringIO
b = StringIO.StringIO()
Conn.setopt(pycurl.URL,'http://ww2.ancorensis.pt/kioskwebnew/calendario.asp', )
Conn.setopt(pycurl.WRITEFUNCTION, b.write)
Conn.perform()
html=b.getvalue()
Ficheiro = open("lolada.txt","w")
Ficheiro.writelines(html)
Ficheiro.close()

Assim Funcionada testado e aprovado  ;):D:)

Ps: na documentação da liberaria esta la que perform retorna None...

A única maneira "à martelada" que estou a ver, é chamares esse script de fora, com o método os.popen e captares o output... de outro script.. mas é verdadeiramente primitivo :)

:eek: prefiria executar na consola assim [user@box:python programa.py>>output.txt] mas agora tambem não é preciso :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora