taistoiathos Posté(e) le 24 mars 2013 Partager Posté(e) le 24 mars 2013 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 More sharing options...
taistoiathos Posté(e) le 24 mars 2013 Auteur Partager Posté(e) le 24 mars 2013 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 More sharing options...
foetus Posté(e) le 24 mars 2013 Partager Posté(e) le 24 mars 2013 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 Effectivement elle est vraiment 'bad' cette URL Lien vers le commentaire Partager sur d’autres sites More sharing options...
taistoiathos Posté(e) le 25 mars 2013 Auteur Partager Posté(e) le 25 mars 2013 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 Effectivement elle est vraiment 'bad' cette URL 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 More sharing options...
taistoiathos Posté(e) le 26 mars 2013 Auteur Partager Posté(e) le 26 mars 2013 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 More sharing options...
foetus Posté(e) le 26 mars 2013 Partager Posté(e) le 26 mars 2013 Je n'ai pas trop le temps et je ne sais pas si j'ai le python installé: Plus Vendredi ce week-end Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.