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