[Python] Duda con comparacion de cadenas en una lectura de socket

Iniciado por Príncipe_Azul, 4 Noviembre 2013, 07:34 AM

0 Miembros y 1 Visitante están viendo este tema.

Príncipe_Azul

Hola! Estoy aprendiendo programacion Python y he creado un bot para el IRC, solo dispone de 4 funciones, pero me hes útil por lo menos para empezar y entenderle un poco al lenguaje.
Mi duda es la siguiente:
¿Cómo puedo comparar códigos HTML en una lectura de sockets con algunas variables?
Es decir lo que quiero que mi bot haga es esto, por ejemplo pondre 12 lineas de código de ejemplo:

<div class="nota clearfix" id="notafinal">
<div class="volanta">PROYECTO APROBADO POR UNANIMIDAD EN EL CONCEJO DELIBERANTE DE LA CAPITAL</div>
<h2><a href="/notas/2013/10/30/proponen-ensenar-ninos-lengua-senas-487696.asp" >Proponen enseñar a los niños la lengua de señas</a></h2>

<div class="fotoNota" id="w300"><a href="/notas/2013/10/30/proponen-ensenar-ninos-lengua-senas-487696.asp" ><img
src="/fotografias/portada/300-171984.jpg" alt="Proponen enseñar a los niños la lengua de señas" width="300" border="0" /></a>
<p class="epigrafe">Los ediles tuvieron una rápida sesión y aprobaron todos los proyectos.</p>
</div>
<div><p><span class="hora">30/10/2013 | </span>Se busca integrar a las personas sordomudas. Un desafío para los jardines de infantes.</p></div>
<div class="comentarios"><a href="/notas/2013/10/30/proponen-ensenar-ninos-lengua-senas-487696.asp#comentarios" >Dejá tu
comentario</a></div>


Lo que yo quiero es que mi bot extraiga informacion de una pagina web de noticias de mi provincia y la envíe al canal principal de la Red.
El código que hice para que el bot detecte el comando es este (voy a poner solo un pedazo de código):

Código (python) [Seleccionar]
if contexto.startswith('!noticias'):
   Web()


Entonces un usuario al ejecutar el comando !noticias el script llama a la función Web
Y el código de la función es así:

Código (python) [Seleccionar]
def Web():
   while 1:
       try:
           f = urllib2.urlopen("http://www.paginadenoticias.com.ar")
           print f.read()
           SantiagoNoticias = f.read()
           f.close()
           break
           if ' | </span>' in SantiagoNoticias:
               CuentaNoticias = CuentaNoticias + 1
               if 10 >= 5: #Esta linea es diferente, la puse asi para ver si puede funcionar el script
                   ContenidoNoticia1 = SantiagoNoticias
                   ContenidoNoticia2 = ContenidoNoticia1.find('</span>') + 7
                   InfoNoticia = ContenidoNoticia1[ContenidoNoticia2:ContenidoNoticia1.find('</p>')]
                   s.send('PRIVMSG #Argentina : 5 %s \r\n' % TituloNoticia)
                   s.send('PRIVMSG #Argentina : 2 %s \r\n' % InfoNoticia)
       except HTTPError, e:
           s.send('PRIVMSG #Argentina : Ha ocurrido un error en la conexion con la pagina web!')
           print e.code
       except URLError, e:
           s.send('PRIVMSG #Argentina : ERROR: La URL es incorrecta . . .')
           print e.reason
       except BaseException as err:
           exit()


Bueno creo que no es necesario pasar todo el código, además quiero hacer mi propio código y me estoy esforzando lo más que puedo para lograrlo, pero siempre necesitamos ayuda de alguien. Espero que sepan comprender.
Al ejecutar el programa, el bot entra al servidor, se loguea y todo bien, hasta incluso no cae obviamente no debe caer, osea me refiero a que responde los "PING's" del servidor cuando el mismo le envía.
Cuando un usuario ejecuta el comando !noticias el código llama a la función Web que ejecuta la tarea de abrir una página web, hasta ahí todo ok, luego veo en la consola todos los códigos de la página que por supuesto pasan demasiado rápido, pero logro ver el final del código, osea que abre bien la conexión y lee bien.
Pero el problema viene ahora, cuando intento comparar si la cadena  | </span> esta dentro de la línea del código HTML que vendría a ser lo mismo que el "isin" de mIRC Scripting, osea si la cadena A se encuentra dentro de la cadena B.
Lo que quiero es que el código trate de guardar en una variable este valor por ejemplo:

<div><p><span class="hora">30/10/2013 | </span>Se busca integrar a las personas sordomudas. Un desafío para los jardines de infantes.</p></div>

Eso es una sola línea y por eso utilicé el ' | </span>' y sería si esa cadena esta (in) en la linea SantiagoNoticias de ser así que guarde en otra variable el contenido de esa cadena para poder quitarle los códigos HTML innecesarios y quedarme solo con la info, osea con la noticia.
He probado poniendo un print "hola" para ver si en cada línea que me mostraba la consola de python aparecían esos "hola", pero sólo apareció al final. Algo así:

</html>
hola

Osea que jamás se va a poder comparar porque es como si fuera que la lectura del socket es de un tirón y se saltara el bucle.
He probado varias maneras pero no consigo hacer que se comparen esas cadenas, en realidad son varias (3), pero solo puse de ejemplo una.
Amigos yo solo quiero por ahora algo basico, osea que compare la información que va extrayendo de la web con una cierta cadena, eso nada más, no creo que sea necesario instalar alguna librería, creo que con las que trae Python es suficiente para lo que necesito, solo es una comparacion de cadenas de textos.
Por favor espero que me ayuden, desde ya les agradezco.
Buena suerte!! :)
Foro de Ayuda de Programación General, IRC y mIRC Scripting: 

0x5d

Hola, que bien que aprendas Python, es hermoso !



Tendrás que aprender a usar la librería "import re" y usar expresiones regulares para extraer la información, es la manera más simple!

PD: Yo uso import re, con la función re.findall(pattern, variable)

Saludos.
¡ SIGUEME EN TWITTER -> @JavierEsteban__ !

Príncipe_Azul

Hola 0x5d, gracias por responder :)
Yo soy programador de mSL (mIRC Scripting Language) y he aprendido muchísimo con ese lenguaje y la verdad que he creado muy buenos addons para mIRC, pero el gran problema es que tenés que tener la pc todo el día para que el bot o el addon funcione, así que me decidí a aprender otro lenguaje, a mi me gusta Python, C, Batch, mSL y TCL, pero había visto códigos de esos lenguajes y me quedé con Python porque me pareció más fácil y me gustó más.

Recién estoy empezando con Python y ya pude terminar mi bot de noticias exitosamente gracias a 2 personas que me ayudaron!!
El problema era que me faltaba una variable, osea la variable CuentaNoticias dentro de la función LeeHTML y con eso pude solucionar mi problema, ya que la variable estaba en otro lado y pensaba que el valor de ella que es 0 se mantenía ahí, pero no, las variables funcionan en cada función/bucle/condición etc... Osea no se pueden declarar variables globales/fijas
De todas maneras les agradezco a todos, muchas gracias y que tengan un buen día!!
Buena suerte!! : )
Foro de Ayuda de Programación General, IRC y mIRC Scripting: