我试图抓取一个有树结构的网站,我想在输出的json文件中重新创建树结构。在
所有的页面都有相同的结构,我必须从一个页面中获取一些字段,然后转到每个链接的子页面并获得相同的字段,等等。。。在
json文件中的项输出如下所示(简化后):
{"Organiation": [{"Administration": "name_adm",
"Rattachement": ["ratt_a", "ratt_b"],
"Organiation": [{"Administration": "name_adm",
"Rattachement": ["ratt_a", "ratt_b"],
"Organiation": [{"Administration": "name_adm",
"Rattachement": ["ratt_a", "ratt_b"],
"Organiation": [null]
}],
"Organiation": [{"Administration": "name_adm",
"Rattachement": ["ratt_a", "ratt_b"],
"Organiation": [{"Administration": "name_adm",
"Rattachement":["ratt_a", "ratt_b"],
"Organiation": [null]
}]
}]
}]
}]
}
我之所以能这样做,是为了每页获得一个项目:
^{pr2}$我花了很多时间试图找到一种方法来实现这一点,但是没有成功,我探索了递归性的选项,但是我没能让它工作,主要是因为我现在不知道如何使用“callback”递归地进行解析(parse函数见下面的代码)。在
以下是我目前所得到的:
def parse(self, response):
for url in response.xpath('//ul[@class = "list-arrow list-narrow"]/li/a/@href').extract():
yield scrapy.Request(url, callback=self.parse_dir_contents)
def parse_dir_contents(self, response):
page = PageItem()
page['Administration'] = response.xpath('//div[@class = "panel-body"]/p/span/text()' ).extract()
Rattachements = []
for site in response.xpath('//ul[@class ="list-connected"]/li'):
Rattachements.append(site.xpath('a/text()').extract())
page['Rattachement'] = Rattachements
Organisations = []
for site in response.xpath('//ul[@data-test="organizations"]/li/a'):
Organisations.append(site.xpath('text()').extract())
page['Organisation'] = Organisations
yield page
URLS = response.xpath('//ul[@data-test="organizations"]/li/a/@href').extract()
for url in URLS:
yield scrapy.Request(url, callback=self.parse_dir_contents)
最后一段代码允许我将每一页放在一个项目中:
URLS = response.xpath('//ul[@data-test="organizations"]/li/a/@href').extract()
for url in URLS:
yield scrapy.Request(url, callback=self.parse_dir_contents)
URL是指向给定页面的下一级子页面的链接。在
当我不能得到树结构时,下一个最佳的想法是把子页面链接的文本列表放入“组织”,但是如果我能得到树结构,我就不需要把这个列表保存在“组织”中。在
如何更改代码以便在Json输出中保留网站的树结构。在
谢谢
您可以通过在Spider中创建一个实例变量,然后在解析函数中向其添加数据来实现这一点。最后,在所有的抓取完成之后,您可以将数据返回到Scrapy框架中进行输出。在
This spider就是一个很好的例子。在
尝试使用jsonmergejsonmerge包将当前输出合并在一起。在
并在所有合并完成后返回项,您可以使用空闲处理程序来实现这一点。在
相关问题 更多 >
编程相关推荐