1

Chrome ブックマーク ファイルを取得するクラスを作成しています (以下の例を参照)。

{
   "checksum": "452bebcad611a3faffb2c009099139e5",
   "roots": {
      "bookmark_bar": {
         "children": [ {
            "date_added": "13028719861473329",
            "id": "4",
            "name": "first bookmark",
            "type": "url",
            "url": "chrome://newtab/"
         }, {
            "children": [ {
               "children": [ {
                  "date_added": "13026904508000000",
                  "id": "7",
                  "name": "Getting Started",
                  "type": "url",
                  "url": "https://www.mozilla.org/en-GB/firefox/central/"
               } ],
               "date_added": "13028740260032410",
               "date_modified": "0",
               "id": "6",
               "name": "Bookmarks Toolbar",
               "type": "folder"
            }, {
               "children": [ {
                  "date_added": "13026904508000000",
                  "id": "9",
                  "name": "Help and Tutorials",
                  "type": "url",
                  "url": "https://www.mozilla.org/en-GB/firefox/help/"
               }, {
                  "date_added": "13026904508000000",
                  "id": "10",
                  "name": "Customise Firefox",
                  "type": "url",
                  "url": "https://www.mozilla.org/en-GB/firefox/customize/"
               }, {
                  "date_added": "13026904508000000",
                  "id": "11",
                  "name": "Get Involved",
                  "type": "url",
                  "url": "https://www.mozilla.org/en-GB/contribute/"
               }, {
                  "date_added": "13026904508000000",
                  "id": "12",
                  "name": "About Us",
                  "type": "url",
                  "url": "https://www.mozilla.org/en-GB/about/"
               } ],
               "date_added": "13028740260032410",
               "date_modified": "0",
               "id": "8",
               "name": "Mozilla Firefox",
               "type": "folder"
            }, {
               "date_added": "13026904551000000",
               "id": "13",
               "name": "Welcome to Firefox",
               "type": "url",
               "url": "http://www.mozilla.org/en-US/firefox/24.0/firstrun/"
            } ],
            "date_added": "13028740260004410",
            "date_modified": "0",
            "id": "5",
            "name": "Imported From Firefox",
            "type": "folder"
         } ],
         "date_added": "13028719626916276",
         "date_modified": "13028719861473329",
         "id": "1",
         "name": "Bookmarks bar",
         "type": "folder"
      },
      "other": {
         "children": [  ],
         "date_added": "13028719626916276",
         "date_modified": "0",
         "id": "2",
         "name": "Other bookmarks",
         "type": "folder"
      },
      "synced": {
         "children": [  ],
         "date_added": "13028719626916276",
         "date_modified": "0",
         "id": "3",
         "name": "Mobile bookmarks",
         "type": "folder"
      }
   },
   "version": 1
}

JSON からネストされたディクショナリに変換し、write_dataメソッド内の関連する各ブックマーク フォルダーの下にあるブックマーク URL を抽出します。

任意の数のブックマーク フォルダーおよび/または各フォルダー内にネストされたブックマークが存在する可能性があるwrite_dataため、ネストされたフォルダーが見つかるたびに子データを抽出し続けるように、メソッド自体を呼び出す必要があります。関連する子辞書を同じメソッドに渡す方法がわかりません。

文字列を使用して辞書パスを構築しようとしました。ループしてパスを動的に構築するには、タプルまたはキーのリストを渡す必要があると思いますが、それを機能させることができず、貧弱な頭が壊れています!

同様の質問がありますが、答えはyield私を完全に混乱させ、とにかく完全に機能する解決策ではありませんでした。助けてください!

import json
import sys
import codecs


class FileExtractor(object):
    def __init__(self, input_file):
        self.infile = codecs.open(input_file, encoding='utf-8')
        self.bookmark_data = json.load(self.infile)

    def write_data(self, my_key):

        for key, value in self.bookmark_data[my_key].iteritems():
            if type(self.bookmark_data[my_key][key]) is dict:
                print self.bookmark_data[my_key][key]['name']
                for subkey, subvalue in self.bookmark_data[my_key][key].iteritems():
                    if subkey == "children" and len(self.bookmark_data[my_key][key][subkey]) <> 0:
                        print "this is a child. I can't figure out how to use write_data with this"
                        #self.write_data('[my_key][key][subkey]')               
                    else:
                        print subkey, ": ",  self.bookmark_data[my_key][key][subkey]

if(__name__=="__main__"):
    stuff= FileExtractor(sys.argv[1])

    stuff.write_data(('roots'))
4

1 に答える 1