2016-05-24 3 views
0

ツリー構造を持つWebサイトをクロールしようとしています。出力されたjsonファイルのツリー構造を再作成したい。Scrapy - ツリー構造を持つWebサイトをクロールし、出力されたJsonファイルに構造を保持する方法

など、リンクされたサブページのそれぞれに移動し、同じフィールドを取得するよりも、すべてのページが同じ構造を持っている、と私はページからいくつかのフィールドを取得する必要が...

項目出力JSONにファイルが(これが簡略化された)、次のようになります。私は多くを費やしている

{"Organiation": [{"Administration": "name_adm", "Rattachement": ["ratt_a", "ratt_b"], "Organisation" = ["orga1", "orga2", ...]]} 
{"Organiation": [{"Administration": "name_adm", "Rattachement": ["ratt_a", "ratt_b"], "Organisation" = ["orga1", "orga2", ...]]} 
etc... 

:私はそうすることができました何

{"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] 
               }] 
            }] 
         }] 
      }] 
} 

は、ページあたりのアイテムを取得することです試してみる時間それを行う方法を見つけましたが、成功しなかったので、私は再帰のオプションを検討しましたが、主に "コールバック"を使って再帰的に解析する方法がないので、これを機能させることができませんでした。解析関数)。ここ

は、私がこれまでに得たものである:

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出力に保存する方法を教えてください。

おかげ

+0

あなたのページのソースコードをペーストビンに掲示してここにリンクできますか? – MetalloyD

+0

http://pastebin.com/gpmLgXHC – Amine

答えて

0

は一緒にあなたの現在の出力をマージするjsonmerge jsonmergeパッケージを使用してみてください。

すべてのマージが完了したときにアイテムを返し、アイドルハンドラを使用してそれを達成できます。

関連する問題