Python 在循环中刮取多个页面会在第三级中产生重复的结果

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

在以下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::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')
by
data=response.meta.get('data').copy()
in
parse_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