[pyar] Desarrollo rápido de un miniparser muy básico
Gustavo Campanelli
gedece en gmail.com
Dom Mar 27 09:46:09 ART 2011
2011/3/25 Sebastian Bassi <sebastian.bassi en globant.com>:
> 2011/3/25 Gustavo Campanelli <gedece en gmail.com>:
>> Te agradezco las recomendaciones, realmente siempre vienen bien.
>> Entiendo la razón de lo de las guías de estilo, pero me gustaría saber
>> porque es mejor usar if '<title>' in reglon: en lugar de usar if
>> renglon.find('<title>') <> -1:
>
> Es que find directamente no hay que usarla. Find fue pensada para
> encontrar DONDE está un elemento en un iterable. A vos no te importa
> eso, en este caso lo que queres saber es si está el elemento o no, no
> te importa en ese momento el donde.
> Te preguntaras porque entonces la hicieron capaz de responder si está
> o no si no es para eso. Supongo que lo hicieron y luego se
> arrepintieron porque se dieron cuenta que devolver un numero (-1) que
> no tiene relación con la realidad (porque no es que el elemento está
> en la posicion -1, sino que no esta) puede ser para problemas si
> alguien toma ese dato y lo usa para otra cosa y arrastraria un error,
> tené en cuenta que en Python existe la posición -1, que es el primero
> contando desde atras.
> Entonces lo ideal es que si queres saber si un elemento está presente,
> usa el operador de pertenencia (in), si luego queres saber la
> posición, usá index.
>
>> Es que una de mis manías es saber porque hago las cosas.
>
> Está perfecto lo que haces, programar sin saber el porque de lo que
> haces seria hacer cargo cult programming:
Gracias por la aclaración. No recordaba el término Cargo Cult aunque
lo conocía con su significado original. Eso si, me parece muy graciosa
la forma en que está aplicada a la programación.
Ahora, con el programa ya corregido, vuelvo a ponerlo aquí. Esta vez
consulta dos sitios en lugar de uno, con lo que pude eliminar una de
las pausas de 1 segundo. Además estuve realizando tests de como
postear código en Blogger y noté que se lleva muy pero muy mal con el
símbolo < , debido a que interfiere con el HTML. Lo retiré de mis
comprobaciones, y todo sigue funcionando, así que ahora además de
portable, el programa es publicable.
Además quité la llamada triple a quitatags() y la reemplacé por una
solitaria antes de comenzar a realizar las comparaciones. Debido que
la lista final[] es distinta (aunque derivada de) a la cadena de texto
renglon, no hay problemas, porque el contenido de renglon no sufre
cambios y todo funciona correctamente.
#!/usr/bin/python
import time
import urllib2
def titulo():
print final[0]
def promedios():
print final [0] + ' Min. ' + final[2] + ' Max. ' + final[3] + ' Prom.
' + final[4] + ' Desviacion +- ' + final[5].split(';')[1]
def precios():
print final[0] + ' ' + final[1] + ' ' + final[2]
print final[4] + ' ' + final[5] + ' ' + final[6]
print final[8] + ' ' + final[9] + ' ' + final[10]
print final[12] + ' ' + final[13] + ' ' + final[14]
print final[16] + ' ' + final[17] + ' ' + final[18] + '\n'
def quitatags(original):
letras = list(original)
result = []
stop = 0
palabra = ''
for letra in letras:
if letra == '<':
stop = 1
if palabra != '':
result.append(palabra)
palabra = ''
if stop == 0:
if letra != '\t':
palabra = palabra + letra
if stop == 1:
if letra == '>':
stop = 0
return result
datafile = open('Articulos_combinados.txt','r')
itemlist = datafile.readlines()
datafile.close()
baseurl_ragial = 'http://ragial.com/item/iRO-Valkyrie/'
baseurl_ragna = 'http://ragnastats.com/gamesearch.php?q='
baseurl_ragna2 = 'http://ragnastats.com/gameaverage.php?q='
for item in itemlist:
if item[0] != '#':
texto = item.split(' ')
texto[1] = texto[1].rstrip()
if texto[1] != '0':
finalurl = baseurl_ragial + texto[1]
webhandle = urllib2.urlopen(finalurl)
price = webhandle.read()
webhandle.close()
tweb = price.split('\n')
for renglon in tweb:
final = quitatags(renglon)
if 'title>' in renglon:
titulo()
if 'Short' in renglon or 'Long' in renglon:
promedios()
if 'tr class="odd">' in renglon:
precios()
item = texto[0].rstrip()
item = item.replace(' ','%20')
finalurl = baseurl_ragna2 + item
webhandle = urllib2.urlopen(finalurl)
price = webhandle.read()
webhandle.close()
print price
time.sleep(1)
finalurl = baseurl_ragna + item
webhandle = urllib2.urlopen(finalurl)
price = webhandle.read()
webhandle.close()
print price
time.sleep(1)
Gedece
More information about the pyar
mailing list