Scrapy不与退货和收益一起工作

时间:2012-12-16 11:34:18

标签: python scrapy

这是我的代码

def parse(self, response):
    soup = BeautifulSoup(response.body)
    hxs = HtmlXPathSelector(response)
    sites = hxs.select('//div[@class="row"]')
    items = []

    for site in sites[:5]:
        item = TestItem()
        item['username'] = "test5"
        request =  Request("http://www.example.org/profile.php",  callback = self.parseUserProfile)
        request.meta['item'] = item
        **yield item**

    mylinks= soup.find_all("a", text="Next")
    if mylinks:
        nextlink = mylinks[0].get('href')
        yield Request(urljoin(response.url, nextlink), callback=self.parse)

def parseUserProfile(self, response):
    item = response.meta['item']
    item['image_urls'] = "test3"
    return item

现在我的上述工作,但我没有得到item['image_urls'] = "test3"

的价值

它将变为空

现在使用return request代替yield item

然后得到cannot use return with generator

的错误

如果我删除此行

yield Request(urljoin(response.url, nextlink), callback=self.parse) 然后我的代码工作正常,我可以得到image_urls,但后来我按照链接

那么有什么方法可以使用return requestyield together以便我获得item_urls

2 个答案:

答案 0 :(得分:1)

我真的不明白你的问题,但我发现你的代码中存在一个问题:

def parseUserProfile(self, response):
    item = response.meta['item']
    item['image_urls'] = "test3"
    return item

解析回调值的返回值应该是序列,因此你应该return [item]或将你的回调转换为生成器:

def parseUserProfile(self, response):
    item = response.meta['item']
    item['image_urls'] = "test3"
    yield item

答案 1 :(得分:1)

看起来你有机械错误。而不是:

for site in sites[:5]:
    item = TestItem()
    item['username'] = "test5"
    request =  Request("http://www.example.org/profile.php",  callback = self.parseUserProfile)
    request.meta['item'] = item
    **yield item**

你需要:

for site in sites[:5]:
    item = TestItem()
    item['username'] = "test5"
    request =  Request("http://www.example.org/profile.php",  callback = self.parseUserProfile)
    request.meta['item'] = item
    yield request