【发布时间】:2012-12-16 11:34:17
【问题描述】:
这是我的代码
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 request 和yield together 来获取item_urls
【问题讨论】:
-
如果你使用
yield,你就可以让你的函数成为一个生成器,这就是你的错误告诉你的。item在parseUserProfile中定义在哪里?是类变量吗? -
@Blender 我忘了在这里添加,我是从元响应中获取的。所以我应该怎么做才能解决我的问题。我在我的问题中添加了
-
对于我的 Scrapy 应用程序,我一直只在回调函数中使用
yield语句,一切正常。您是否尝试在parseUserProfile中将return item替换为yield item? -
我尝试从解析中删除
yield item并在parseUserProfile中用yield item替换返回项,然后数据库中没有保存任何内容。蜘蛛运行良好但scrapy没有得到任何物品 -
这是一个关于生成器的 python 错误——你不能同时产生和返回项目(或请求)。选择一个,要么使用生成器,要么不使用。您可以从 scrapy 中的回调返回任何 python 序列。至于你的蜘蛛,听起来你想从 parse 中产生请求,它们的回调设置为 self.parseUserProfile(不是 self.parse),并且该回调完成了项目中的数据。