Python 在循环中刮取多个页面会在第三级中产生重复的结果
在以下HTML模板中:Python 在循环中刮取多个页面会在第三级中产生重复的结果,python,scrapy,Python,Scrapy,在以下HTML模板中: 级别1(模板1) 问题可能是您在parse中只定义了一次data,因此parse_lv2中的每个循环将共享相同的dict数据,而parse_lv3中的每个循环也将共享数据,这就是为什么最后在data['temp\u text']中有最后一个parse_lv2循环的结果 您最好像这样初始化parse_lv2循环中的数据 def parse(self, response): yield scrapy.Request(url=response.css('a::a
级别1(模板1)
-
问题可能是您在parse
中只定义了一次data
,因此parse_lv2
中的每个循环将共享相同的dict数据
,而parse_lv3
中的每个循环也将共享数据,这就是为什么最后在data['temp\u text']
中有最后一个parse_lv2
循环的结果
您最好像这样初始化parse_lv2
循环中的数据
def parse(self, response):
yield scrapy.Request(url=response.css('a::attr(href)').extract_first(), callback=self.parse_lv2, dont_filter=True)
def parse_lv2(self, response):
for a in response.css('a'):
data = dict()
data['temp_text'] = a.css('a::text').extract_first()
yield scrapy.Request(url=a.css('a::attr(href)').extract_first(), callback=self.parse_lv3, dont_filter=True, meta={"data": data})
我在parse
中也提取了一些数据,但由于它们看起来并不重要,所以没有编写它们,这将添加一个样本,以便现在就适合parse
,因此您可能应该复制一份dict,以免在parse\u lv2
的每个循环中都有相同的dict,因此您应该尝试替换data=response.meta.get('data')
bydata=response.meta.get('data').copy()
inparse_lv2
@是的,如果可能的话,这个问题已经解决了,你能解释一下副本是如何改变它的吗?当然,dict的问题是我们操纵了一个指向python对象的指针。所以如果你这样做的话,a=dict()
然后b=a
b
和a
将使用相同的命令,这意味着如果修改a
它也将修改b
,这就是为什么这里会出现问题,因为当您修改数据['temp\u text']=a.css('a::text')。首先提取()
它修改了所有提供给parse_lv2
和parse_lv3
的dict
而不是b=a
,python将创建一个新的python对象,该对象是a
的副本,并创建一个指向该对象的新指针,该指针将与b
链接,因此修改a
不会修改b