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

使用しているスクレイピーのバージョン。0.16.2 のドキュメントには、アイテムを別の 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 など) が欠落しているため、これはテストされておらず、これがどのように実行されているかわかりません。

于 2012-12-12T08:33:14.803 に答える
3

2つの利回り

あなたは2回譲歩しています - 最初はRequestです。2番目はdicです。( yield Request(...)yield item )

2回目は不要で、削除する必要があると思います。それを試して、以下にコメントしてください。( yield itemという行を削除します)

于 2012-12-12T05:09:32.863 に答える