3

这是我的代码

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

4

2 回答 2

2

我不太了解您的问题,但我在您的代码中看到了一个问题:

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
于 2012-12-17T12:41:42.953 回答
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
于 2012-12-17T13:52:15.210 回答