如何抓取一个树结构的网站,并保持在输出的Json-fi结构

2024-10-05 17:27:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图抓取一个有树结构的网站,我想在输出的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输出中保留网站的树结构。在

谢谢


Tags: nameselfurlforparseresponseextract页面
2条回答

您可以通过在Spider中创建一个实例变量,然后在解析函数中向其添加数据来实现这一点。最后,在所有的抓取完成之后,您可以将数据返回到Scrapy框架中进行输出。在

This spider就是一个很好的例子。在

尝试使用jsonmergejsonmerge包将当前输出合并在一起。在

并在所有合并完成后返回项,您可以使用空闲处理程序来实现这一点。在

相关问题 更多 >