Python Scrapy不与退货和产量一起工作
这是我的密码Python Scrapy不与退货和产量一起工作,python,scrapy,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'
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\u url']=“test3”
它是空的
现在如果使用退货请求
而不是退货项目
然后获取错误,无法将return与生成器一起使用
如果我删除这行
yield请求(urljoin(response.url,nextlink),callback=self.parse)
然后我的代码工作正常,我可以得到image\u URL
,但是我不能跟随链接
那么有没有办法让我可以使用
返回请求
和屈服
,这样我就可以得到项目的URL我真的不理解你的问题,但我发现你的代码中有一个问题:
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
看起来你有机械故障。而不是:
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
如果你使用
yield
你将你的函数变成一个生成器,这就是你的错误告诉你的。parseUserProfile
中定义的项在哪里?这是一个类变量吗?@Blender我忘了在这里添加,我是从元响应中得到的。那么,我应该做些什么来解决我的问题呢。我在我的问题中添加了我的Scrapy应用程序,我总是在我的回调函数中只使用yield
语句,并且一切正常。您是否尝试在parseUserProfile
中用yield item
替换return item
?我尝试从parse中删除yield item
,并在parseUserProfile
中用yield item
替换return item,然后数据库中不会保存任何内容。spider运行良好,但scrapy不会获取任何关于生成器的python错误——您不能同时生成和返回项(或请求)。选择一个,要么使用发电机,要么不使用。您可以在scrapy中从回调返回任何python序列。至于你的spider,听起来你想从parse生成请求,它们的回调设置为self.parseUserProfile(不是self.parse),回调完成了项目中的数据,这个yield项也在工作,但我的问题是返回项
和获取下一个链接的逻辑在同一个函数中。因此,要么我应该返回页面上解析的项目
,要么我应该返回请求
,以便抓取下一个链接。在爬行蜘蛛中,规则会自动跟踪从链接提取器获取的链接,但在basespider中,我必须手动获取链接并手动遵循它们。这就是我遇到的一个问题,我没有收到scrapy退回的任何物品。我在数据库中只得到一个条目。我没有得到任何错误,爬虫程序运行正常,但scrapy在第一个项目旁边没有得到任何项目。我们非常接近解决这个问题,因为我没有得到任何错误。我甚至试着在parseuserprofile中放入yield item,但它没有返回任何项目。唯一正确返回项目的是返回请求
,但我不能使用第二个yield。在parseuserprofile
中,放入yield item
我已经尝试过了,但没有得到任何由它返回的项目。你知道吗必须调试。在回调中设置跟踪,查看是否调用了任何东西。