4

我有这个代码。当我使用 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
4

2 回答 2

4

你用的是哪个版本的scrapy。0.16.2 的文档有这种将项目传递给另一个回调的方法。

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 等)丢失了,我不确定它是如何运行的

于 2012-12-12T08:33:14.803 回答
3

两次产量

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

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

于 2012-12-12T05:09:32.863 回答