[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