【问题标题】:Getting error with yield in scrapy python在scrapy python中获取错误
【发布时间】:2012-12-12 05:05:18
【问题描述】:

我有这个代码。当我使用 yyield 请求更多链接时,我得到了这个错误

Spider must return Request, BaseItem or None, got 'dict' 

我已经尝试了很多,但我无法摆脱错误

代码在这里

def parse_items(self, response):
    hxs = HtmlXPathSelector(response)
    sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]")
    items = []


    for site in sites[:2]:

        item = SeekItem()
        item['title'] = myfilter(site.select('dl/dd/h2/a').select("string()").extract())
        item['link_url'] = myfilter(site.select('dl/dd/h2/em').select("string()").extract())
        item['description'] = myfilter(site.select('dl/dd/p').select("string()").extract())
        if  item['link_url']:
                      yield Request(urljoin('http://www.seek.com.au/', item['link_url']),
                      meta = item,
                      callback = self.parseItemDescription)

        yield item

def parseItemDescription(self, response):

    item = response.meta
    hxs = HtmlXPathSelector(response)
    sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]")
    item['description'] = "mytest"

    return item

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    您使用的是哪个版本的 scrapy。 0.16.2的文档有passing items to another callback这个方法。

    def parse_items(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]")
        items = []
    
        for site in sites[:2]:
            item = SeekItem()
            item['title'] = myfilter(site.select('dl/dd/h2/a').select("string()").extract())
            item['link_url'] = myfilter(site.select('dl/dd/h2/em').select("string()").extract())
            item['description'] = myfilter(site.select('dl/dd/p').select("string()").extract())
            if item['link_url']:
                request = Request("http://www.example.com/some_page.html", callback=self.parseItemDescription)
                request.meta['item'] = item
                return request
    
    def parseItemDescription(self, response):
    
        item = response.meta['item']
        hxs = HtmlXPathSelector(response)
        sites = hxs.select("//li[contains(concat(' ', @class, ' '), ' mod-searchresult-entry ')]")
        item['description'] = "mytest"
    
        return item
    

    注意:这是未经测试的,因为您的其余代码(蜘蛛、items.py 等)丢失了,我不确定它是如何运行的

    【讨论】:

      【解决方案2】:

      两次产出

      你让步了两次——第一次是请求;第二个是dic。 (yield Request(...)yield item)

      我猜第二次是不必要的,应该删除。试试这个并在下面评论。 (删除说 yield item 的行)

      【讨论】:

      • 另外,self.parseItemDescription 之后的额外括号是怎么回事?
      • 好的。当我删除 yield item 时,它不起作用,但是当我删除第二个 return item 时,它起作用了。但是我的描述没有被插入到项目中。第二个括号是 Request() 并且工作正常
      • 您的意思是在某些响应上调用 parseItemDescription 吗?你有 self.parseItemDescription,没有任何括号来调用函数 - 你为什么要这样做?
      • 它一直工作得很好,我认为它是一个回调。喜欢这里stackoverflow.com/questions/10798118/…
      • 在您链接到的问题中,回调函数没有返回。是这个问题吗?
      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 2022-12-18
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多