Aller au contenu

Python mystérieux


Messages recommandés

Bonjour,

je suis en train d'écrire un script en python pour récupérer les informations sur un DVD à partir du site fnac.com. Actuellement ce que j'ai

écrit est

#! /usr/bin/env python# -*- coding: utf-8 -*-import Pmwimport urllib2import reimport sysimport osurlroot = 'http://recherche.fnac.com/Search/SearchResult.aspx?SCat=4!1&Search='urlend = '&sft=1&submitbtn=OK'Browserpath = '/usr/bin/opera'from Tkinter import *root = Tk()master = Frame(root)master.pack()e = Entry(master)e.pack()e.focus_set()answer = ""def recup(adrs):print "retrieving informations from"print adrsf=open('/var/www/fnactest.html','w')start=0for line in urllib2.urlopen(adrs):	if "données détaillée de l'article" in line:		start=1		print "we have found the begining of the table"	if start > 0:		print line	  # ligne ajoutée pour debug  (1)		f.write(line)		if '</table' in line:			f.close			breakos.execl(Browserpath,'localhost/fnactest.html')def callback(tag):# This is called whenever the user clicks on a# button in the RadioSelect widget.recup( dic[tag])def menu(dic): # for k,v in dic.iteritems():#   print k,v # for text in dic.keys:  # radio.add(text)  # Initialise Tkinter and Pmw.  root = Pmw.initialise(fontScheme = 'pmw1')  root.title('Click on the title')# Create and pack a RadioSelect widget.  radio = Pmw.RadioSelect(	command = callback,	labelpos = 'w',	orient = 'vertical')  radio.pack(padx = 20, pady = 20)# Add some buttons to the RadioSelect.  for k,v in dic.iteritems():radio.add(k) # radio.invoke('Vegetables')# Create an exit button.  exit = Button(text = 'Cancel', command = root.destroy)  exit.pack(pady = 20)def printanswer(): global answer global dic answer = e.get() url = urlroot  + answer + urlend dic={} previous=0 current=0#  f=open('/var/www/fnactest.html','w') for line in urllib2.urlopen(url):if previous > 0 :	current=1	previous=0if '"lienInverse title"' in line:	previous = 1#if 'google_adtest' in line:#	breakif current > 0:	if '?' in line:		newline=line.split('?')		val=newline[0].replace('<a href="','',1)		splitfurther=newline[1].split('>')		key=splitfurther[1].replace('</a','')		dic[key]=val	else:		newline=line.split('" class')		val=newline[0].replace('<a href="','',1)		splitfurther=newline[1].split('>')		key=splitfurther[1].replace('</a','')	#print(val)	#print(key)	#f.write(line)	#f.write("<br>")current=0#Now that the dictionary is created, we show the second menu#Might be neeter if we define the second menu as a function root.destroy() menu(dic) #f.close()# print answer# b1 = Button(master, text="SET", width=10, command=setanswer)# b1.pack()b2 = Button(master, text="Search", width=10, command=printanswer)b2.pack()

Normalement, ce qu'il fait, c'est :

1) il ouvre une fenetre où on peut saisir des mots clé d'un DVD

2) quand on saisit les mots, et clique sur le button "Search", il ouvre une nouvelle fenêtre avec les titres des DVD trouvés

3) quand on clique sur un titre, il récupère les informations concernant le DVD choisi, les écrit sur le fichier

/var/www/fnactest.html, puis lance opera (on suppose qu'il est installé à /usr/bin/opera) pour ouvrir la page (on suppose aussi qu'il y a un serveur http qui tourne et le répertoire racine est /var/www)

Or, il marche environ une fois sur deux. Par exemple, si je tape dans la premiè fenêtre "fille" et je choisis le DVD "La fille à la valise", ça marche parfaitement, tandisque si je choisis le DVD "Jamais sans ma fille", ça ne marche pas. Enfin, sur le terminal, je vois exactement ce quil faut (output de la ligne (1)), mais dans le fichier,

/var/www/fnactest.html, il n'y a rien.

Selon vous, où est le problème ? Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

C'est encore plus mystérieux que je ne l'imaginais. Puisque la fonction "printanswer" (bon, je sais, ce n'est pas vraiment un nom approprié, mais comme j'ai commenceé en faisant

copier-coller...) fait ce qu'il devrait, c'est-à dire définir la dictionaire "dic", et la fonction menu affiche le bon menu, puis la fonction callback appelle correctement la fonction recup,

je me suis dit que le problème ne peut provenir que de la fonction recup. Donc, j'ai fait un "exemple minimal" comme suit

#! /usr/bin/env python# -*- coding: utf-8 -*-import urllib2import reimport sysimport osurlgood="http://video.fnac.com/a2230121/La-Fille-a-la-valise-Claudia-Cardinale-DVD-Zone-2" #c'est l'url  d'un dvd qui marchaiturlbad="http://video.fnac.com/a1616796/Jamais-sans-ma-fille-Sally-Field-DVD-Zone-2"			#c'est l'url  d'un dvd qui ne marchait paschoice=[urlgood,urlbad]def recup(adrs):print "retrieving informations from"print adrsf=open('/var/www/fnactest.html','w')start=0for line in urllib2.urlopen(adrs):	if "données détaillée de l'article" in line:		start=1		print "we have found the begining of the table"	if start > 0:		print line		f.write(line)		if '</table' in line:			f.close			breakrecup(choice[int(sys.argv[1])])

Appellons ce code debug.py. Normalement, vu ce qui s'est passé avec le script d'avant, si je fais ./debug.py 0 ça devait marcher, tandisque si je fait ./debug.py 1, ça ne devrait marcher qu' à moitié, i.e., le fichier /var/www/fnactest.html devrait être vide.

Or, ce n'est pas ce qui se passe. Ce code fait exactement ce qu'il doit faire... Donc, la question : si la fonction "recup" n'est pas la fautive, d'où vient l'erreur ? Merci d'avance...

Lien vers le commentaire
Partager sur d’autres sites

urlbad="http://video.fnac.com/a1616796/Jamais-sans-ma-fille-Sally-Field-DVD-Zone-2" #c'est l'url d'un dvd qui ne marchait pas

:siffle: Effectivement elle est vraiment 'bad' cette URL :siffle:

Au cas où Python censurerait des DVD selon la qualité du film, j'ai fait un petit essai. Par ailleurs comme je ne voulais pas saisir le mot-clé chaque fois, j'ai modifié

un peu le code, le nouveau code pour le debugging est

#! /usr/bin/env python# -*- coding: utf-8 -*-import Pmwimport urllib2import reimport sysimport osurlroot = 'http://recherche.fnac.com/Search/SearchResult.aspx?SCat=4!1&Search='urlend = '&sft=1&submitbtn=OK'Browserpath = '/usr/bin/opera'from Tkinter import *root = Tk()master = Frame(root)master.pack()e = Entry(master)e.pack()e.focus_set()answer = ""def recup(adrs):   print "retrieving informations from"   print adrs   f=open('/var/www/fnactest.html','w')   start=0   for line in urllib2.urlopen(adrs):       if "données détaillée de l'article" in line:           start=1           print "we have found the begining of the table"       if start > 0:           print line           f.write(line)           if '</table' in line:               f.close               break   os.execl(Browserpath,'localhost/fnactest.html')def callback(tag):   # This is called whenever the user clicks on a   # button in the RadioSelect widget.   print "function recup called"   print dic[tag]   recup( dic[tag])def menu(dic): # for k,v in dic.iteritems():   #   print k,v # for text in dic.keys:  # radio.add(text)  # Initialise Tkinter and Pmw.  root = Pmw.initialise(fontScheme = 'pmw1')  root.title('Click on the title')# Create and pack a RadioSelect widget.  radio = Pmw.RadioSelect(    command = callback,    labelpos = 'w',    orient = 'vertical')  radio.pack(padx = 20, pady = 20)# Add some buttons to the RadioSelect.  for k,v in dic.iteritems():   radio.add(k) # radio.invoke('Vegetables')# Create an exit button.  exit = Button(text = 'Cancel', command = root.destroy)  exit.pack(pady = 20)def printanswer(): global answer global dic #answer = e.get() answer="fille" url = urlroot  + answer + urlend dic={} previous=0 current=0#  f=open('/var/www/fnactest.html','w') for line in urllib2.urlopen(url):   if previous > 0 :       current=1       previous=0   if '"lienInverse title"' in line:       previous = 1   #if 'google_adtest' in line:   #    break   if current > 0:       if '?' in line:           newline=line.split('?')           val=newline[0].replace('<a href="','',1)           splitfurther=newline[1].split('>')           key=splitfurther[1].replace('</a','')           dic[key]=val       else:           newline=line.split('" class')           val=newline[0].replace('<a href="','',1)           splitfurther=newline[1].split('>')           key=splitfurther[1].replace('</a','')       #print(val)       #print(key)       #f.write(line)       #f.write("<br>")   current=0   #Now that the dictionary is created, we show the second menu   #Might be neeter if we define the second menu as a function root.destroy() menu(dic) #f.close()# print answer# b1 = Button(master, text="SET", width=10, command=setanswer)# b1.pack()#b2 = Button(master, text="Search", width=10, command=printanswer)#b2.pack()#answer="fille"printanswer()root.mainloop()

Les résultats de l'expérience : sur les 15 dvds, seuls "Un gars, une fille"..., "Jamais sans ma fille" et "Millenium2" posent des problèmes, les autres marchent...

Lien vers le commentaire
Partager sur d’autres sites

Je continue le debugging, et j'ai fait le code suivant. Cette fois-ci, il n'y a plus de menu du tout, il cherche donc tout seul les informations sur les 15 (premiers) dvd ayant "fille"

dans le titre ou mot-clé. Et là, le script fait exactement ce qu'il doit. Ce qui confirme que la fonction "printanswer" passe des arguments correctes à la fonction menu()

(qui est remplacée par la fonction newmenu() dans le nouveau code de debugging). Or, la différence entre la fonction menu() et newmenu(), c'est just le gui pour choisir un titre parmi les 15... Quelqu'un pourrait m'aider s'il vous plaît?

#! /usr/bin/env python# -*- coding: utf-8 -*-import Pmwimport urllib2import reimport sysimport osurlroot = 'http://recherche.fnac.com/Search/SearchResult.aspx?SCat=4!1&Search='urlend = '&sft=1&submitbtn=OK'Browserpath = '/usr/bin/opera'from Tkinter import *root = Tk()master = Frame(root)master.pack()e = Entry(master)e.pack()e.focus_set()answer = ""def recup(adrs):   print "retrieving informations from"   print adrs   f=open('/var/www/fnactest.html','w')   start=0   for line in urllib2.urlopen(adrs):       if "données détaillée de l'article" in line:           start=1           print "we have found the begining of the table"       if start > 0:           print line           f.write(line)           if '</table' in line:               f.close               break   os.execl(Browserpath,'localhost/fnactest.html')def callback(tag):   # This is called whenever the user clicks on a   # button in the RadioSelect widget.   print "function recup called"   print dic[tag]   recup(dic[tag])def newmenu(dic): #function introduced for debugging purpose only   j=0   for k,v in dic.iteritems():       print k       print v       f=open('/var/www/fnactest'+str(j)+ '.html','w')       start=0       for line in urllib2.urlopen(v):           if "données détaillée de l'article" in line:               start=1               print "we have found the begining of the table"           if start > 0:           #print line               f.write(line)               if '</table' in line:                   f.close                   break       j=j+1def menu(dic): # for k,v in dic.iteritems():   #   print k,v # for text in dic.keys:  # radio.add(text)  # Initialise Tkinter and Pmw.  root = Pmw.initialise(fontScheme = 'pmw1')  root.title('Click on the title')# Create and pack a RadioSelect widget.  radio = Pmw.RadioSelect(    command = callback,    labelpos = 'w',    orient = 'vertical')  radio.pack(padx = 20, pady = 20)# Add some buttons to the RadioSelect.  for k,v in dic.iteritems():   radio.add(k) # radio.invoke('Vegetables')# Create an exit button.  exit = Button(text = 'Cancel', command = root.destroy)  exit.pack(pady = 20)def printanswer(): #this function searches for dvd's with "answer" in keywords, store the information into a dictionary, and call the function menu global answer global dic #answer = e.get() answer="fille" url = urlroot  + answer + urlend dic={} previous=0 current=0#  f=open('/var/www/fnactest.html','w') for line in urllib2.urlopen(url):   if previous > 0 :       current=1       previous=0   if '"lienInverse title"' in line:       previous = 1   #if 'google_adtest' in line:   #    break   if current > 0:       if '?' in line:           newline=line.split('?')           val=newline[0].replace('<a href="','',1)           splitfurther=newline[1].split('>')           key=splitfurther[1].replace('</a','')           dic[key]=val       else:           newline=line.split('" class')           val=newline[0].replace('<a href="','',1)           splitfurther=newline[1].split('>')           key=splitfurther[1].replace('</a','')       #print(val)       #print(key)       #f.write(line)       #f.write("<br>")   current=0   #Now that the dictionary is created, we show the second menu   #Might be neeter if we define the second menu as a function root.destroy()#  menu(dic) commented out for debugging newmenu(dic) #f.close()# print answer# b1 = Button(master, text="SET", width=10, command=setanswer)# b1.pack()#b2 = Button(master, text="Search", width=10, command=printanswer)#b2.pack()#answer="fille"printanswer()root.mainloop()
Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...