Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy不与退货和产量一起工作_Python_Scrapy - Fatal编程技术网

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
我已经尝试过了,但没有得到任何由它返回的项目。你知道吗必须调试。在回调中设置跟踪,查看是否调用了任何东西。