【问题标题】:How to return data in separated function form the scrapy parse function?如何从scrapy parse函数中以分离函数返回数据?
【发布时间】:2018-01-27 11:26:12
【问题描述】:

我有一个使用scrapy从网站获取一些数据的解析函数,这个函数通过这个函数将一些数据传递给另一个函数,我无法返回输出!,我尝试使用打印它工作但我需要使用返回以获取 json 文件中的数据。 如何使打印的func返回项目?

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) 

我在func_2中有一些操作,然后将其传递给另一个函数“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 不返回任何东西,谁能告诉我为什么?

【问题讨论】:

  • 正确格式化您的代码,使其可读
  • @TarunLalwani 完成。你知道为什么 print func 不返回项目吗?

标签: python scrapy return scrapy-spider yield


【解决方案1】:

Scrapy 检查解析函数的返回值。现在,如果您在其中调用一个函数并丢弃它的返回值,那么您不会从解析函数中返回任何内容

所以你的代码应该从

for tr in tr_data:
    func_2(tr) 

for tr in tr_data:
    yield func_2(tr) 

这将确保func_2 返回的任何项目都传递给scrapy 框架。同样在您的 func_2 函数中,您将调用 print_func,因此您需要捕获它的返回值并将其传递回调用函数

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

您需要在 parse 函数中获取值,然后从那里产生它。仅仅从任何函数返回它是行不通的。

【讨论】:

  • 我有这么多的嵌套函数。我可以将数据传回解析函数,然后将它们收集到一个列表中,然后循环返回列表吗?
  • 是的,你需要在你的主解析函数中让出,剩下的地方它只会返回。如果您返回一个列表,那么您可以使用yield from。如果您使用 python 2.x,则只需循环并生成项目
【解决方案2】:

对于 parse 方法中的任何其他函数,这样写:

def parse(self, response):
    for req in self.call_your_function(self, param):
        yield req

或者,在 Python 3 中:

def parse(self, response):    
    yield from self.call_your_function(self, param)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-22
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2018-11-20
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多