2017-08-18 4 views
0

J'ai une fonction d'analyse en utilisant scrapy pour obtenir des données d'un site web, cette fonction passe certaines données à une autre fonction avec cette fonction, je ne peux pas retourner la sortie !, je l'ai essayé avec print ça marche mais je dois utiliser return pour obtenir les données dans un fichier json. Comment faire des éléments de retour de fonction imprimés?Comment renvoyer des données sous forme de fonction séparée de la fonction scrapy parse?

def parse(self, response): 
    all_tr= list() 
    for tr in response.xpath('//tr').extract(): 
      all_tr.append(tr) 
    tr_data = list() 
    city_tr = list() 
    for tr in all_tr: 
      if re.findall(r'class="city".+name.+?<', tr): 
      city_tr.append(tr) 
      else: 
      pass 
    c= 0 
    const =1 
    while const ==1: 
      try: 
      start=city_tr[c] 
      end= city_tr[c+1] 
      indexStart=all_tr.index(start) 
      indexEnd=all_tr.index(end) 
      tr_data.append(all_tr[indexStart:indexEnd]) 
      c=c+1 
      except IndexError: 
      const=2 
      tr_data.append(all_tr[all_tr.index(start):]) 
    for tr in tr_data: 
      func_2(tr) 

j'ai quelques opérations func_2, en passant ensuite à un autre Fnction "prin func"

def print_func(city,days, tr): 
    if len(days)==0: 
     item=PropertiesItem() 
     item['Name']= "" 
     item['City']= city 
     item['State']= "CA" 
     return item 

print_func ne reviennent pas quoi que ce soit, quelqu'un pourrait-il s'il vous plaît dire à mon pourquoi? Scrapy vérifie la valeur de retour de la fonction d'analyse.

+0

Formater votre code correctement afin qu'il soit lisible –

+0

@TarunLalwani fait. Avez-vous une idée de la raison pour laquelle la fonction d'impression ne renvoie pas l'élément? –

Répondre

0

Scrapy vérifie la valeur de retour de la fonction d'analyse. Maintenant, si vous appelez une fonction à l'intérieur et défaussez la valeur renvoyée alors vous ne retournez pas quoi que ce soit de la fonction d'analyse en tant que telle

Donc, votre code devrait changer de

for tr in tr_data: 
    func_2(tr) 

à

for tr in tr_data: 
    yield func_2(tr) 

Cela garantira que l'élément func_2 retourné est transmis à l'infrastructure scrapy. Aussi dans votre fonction func_2 vous appellerez print_func, vous devez capturer la valeur renvoyée et renvoient la balle à la fonction appelante

def func_2(....): 
    .... 
    item = print_func(...) 
    ... 
    return item 

Vous devez obtenir la valeur en fonction parse puis le céder à partir de là. Juste le renvoyer de n'importe quelle fonction ne fonctionne pas.

+0

J'ai tellement de fonctions nedsted. Puis-je renvoyer les données à la fonction d'analyse, puis les rassembler dans une liste par exemple, et boucler la liste pour le retour? –

+0

Oui, vous aurez besoin de céder dans votre fonction d'analyse principale, reposez-vous tous les endroits où il serait retourné seulement. Si vous renvoyez une liste, vous pouvez utiliser 'yield from'. Si vous utilisez python 2.x, il suffit de boucler et de céder les éléments –