我如何从';收益率';用python?

我如何从';收益率';用python?,python,scrapy,yield,Python,Scrapy,Yield,也许Python中的yield对某些人来说是补救措施,但对我来说不是。。。至少现在还没有。 我理解yield创建了一个“生成器” 当我决定学习scrapy时,我偶然发现了yield。 我为Spider编写了一些代码,其工作原理如下: 转到开始超链接并提取所有超链接-它们不是完整的超链接,只是连接到开始超链接上的子目录 检查超链接将满足特定条件的超链接附加到基础超链接 使用请求导航到新的超链接,并解析以在带有“onclick”的元素中查找唯一id 编辑1: for

也许Python中的
yield
对某些人来说是补救措施,但对我来说不是。。。至少现在还没有。 我理解
yield
创建了一个“生成器”

当我决定学习scrapy时,我偶然发现了
yield
。 我为Spider编写了一些代码,其工作原理如下:

  • 转到开始超链接并提取所有超链接-它们不是完整的超链接,只是连接到开始超链接上的子目录
  • 检查超链接将满足特定条件的超链接附加到基础超链接
  • 使用请求导航到新的超链接,并解析以在带有“onclick”的元素中查找唯一id
  • 编辑1:

                    for uid_dict in self.parse_new(response):
                       print(uid_dict['uid'])
                       break
    
    结束编辑1

    在此处运行代码将
    response
    评估为对
    start\u url
    的HTTP响应,而不是对
    next\u link
    的HTTP响应

        def parse_new(self, response)
            trs = response.xpath("//*[@class='unit-directory-row']").getall()
            for tr in trs:
                if 'SpecificText' in tr:
                    elements = tr.split()
                    for element in elements:
                        if 'onclick' in element:
                            subelement = element.split('(')[1]
                            uid = subelement.split(')')[0]
                            print(uid)
                            yield {
                                'uid': uid
                            }
                    break
    
    它可以工作,scrapy会抓取第一页,创建新的超链接并导航到下一页。新的语法分析器解析uid的HTML并“产生”它。scrapy的引擎显示“产生”了正确的油

    我不明白的是,我如何“使用”通过parse_new获得的uid来创建和导航到一个新的超链接,就像我是一个变量一样,而且我似乎无法通过
    请求返回一个变量

    我想了解一下
    yield
    是如何工作的

    同时,
    spider.parse_new(response)
    是一个可移植的对象。也就是说,您可以通过
    for
    循环获取其生成的结果。例如:

    for uid_dict in spider.parse_new(response):
        print(uid_dict['uid'])
    

    经过大量阅读和学习,我发现了scrapy在第一次解析中不执行回调的原因,它与产量无关!这与两个问题有很大关系:

    1)
    robots.txt
    。可以使用settings.py中的
    ROBOTSTXT\u OBEY=False“解析”


    2) 记录器已过滤到
    的场外请求
    don_filter=True
    可能会解决此问题。

    您需要迭代方法返回的内容这是否回答了您的问题?我读过几篇关于
    yield
    的文章。更多的是来自VBA背景,我的大脑一想到它就会痛,但会适应的。如果我理解正确,yield将在内存中创建一个“生成器”,而不是存储一组生成的值。我把生成器想象成一个可以随时调用的函数。我需要读完那本参考书。看起来很不错,“随时都可以叫”← 实际上,这个位子不准确。生成器只能迭代一次,这一点对于理解以避免将来的麻烦很重要。我想他的意思是你可以随时调用
    next
    。仍然丢失。似乎
    yield Request(new\u link,callback=self.parse\u new)
    parse\u new()创建为生成器。那么,
    响应
    到底是什么呢?在您的代码中,我假定
    uid\u dict
    被视为从生成器返回的变量<代码>响应
    正在传递给生成器,以计算并返回
    uid\u dict
    。但是当我单步执行代码
    时,响应
    将继续作为对原始
    启动URL
    请求的响应。那么
    response
    何时以及如何分配给
    new_链接
    请求?返回quotesbotSpider
    def parse(self,response):for quote in response.xpath(“”):print(quote)产生{'text':quote.xpath('xref')。extract_first(),'author':quote.xpath('xref')。extract()}print(quote['text'])
    print(quote)工作,print(quote)['text'])不可订阅。
    'Selector'对象不可订阅。
    我不知道如何访问生成的字典。
    for uid_dict in spider.parse_new(response):
        print(uid_dict['uid'])