2015-04-05 1 views
-1

Файл Bookmarks.plist - как Safari хранит закладки. Как подсчитать все URLStrings?итерирование всех закладок в Bookmarks.plist

я могу получить файл закладок с:

BOOKMARKS_PLIST = '~/Library/Safari/Bookmarks.plist

преобразовать его в текст из двоичного с:

converted = subprocess.call(['plutil', '-convert', 'xml1', bookmarksFileCopy])

и, например, получить доступ к одной записи с:

'print plist [' Children '] [5] [' Children '] [1] [' Children '] [2]'

Кажется, я должен использовать рекурсию, чтобы спуститься по «листьям дерева», но я не могу получить синтаксис прямо в python. Как вы можете сказать, я новичок.

EDIT: Спасибо, Хосе. Хотя ваше решение дало ошибку, я описал ниже, я получил эту работу:

import plistlib 
import subprocess 
import os 

def countURLStrings(plistDict): 
    childURLCounts = 0 
    if 'Children' in plistDict.keys(): 
     for child in plistDict['Children']: 
      childURLCounts += countURLStrings(child) 
    if 'URLString' in plistDict.keys(): 
     childURLCounts += 1 
     print plistDict.URLString 
    return childURLCounts 

BOOKMARKS_PLIST = '/Users/me/Desktop/Safari-20150403175048/Bookmarks.plist' 
converted = subprocess.call(['plutil', '-convert', 'xml1', BOOKMARKS_PLIST]) 

pl = plistlib.readPlist(BOOKMARKS_PLIST) 

ct = countURLStrings(pl) 

print ct 

И в качестве бонуса, это итерированная версия быстрее, чем рекурсии я попробовал и потерпел неудачу в.

ответ

1

Первый пример кода работает в Python 3.4.2. Метод load() недоступен в 2.x, и метод readPlist() обнаруживает ошибку. Второй пример кода был успешно протестирован с Python 2.7.6.

BOOKMARKS_PLIST

  • Заменить имя пользователя в определении (BOOKMARKS_PLIST) с правильным именем пользователя
  • метод при условии [countURLStrings (plistDict)] рекурсивно вызывает себя с каждым встречается экземпляр «детей» словарь и увеличивает счет на один для каждого найденного URLString.

Пример кода Python 3.4.2

import plistlib 

def countURLStrings(plistDict): 
    childURLCounts = 0 
    if 'Children' in plistDict.keys(): 
     for child in plistDict['Children']: 
      childURLCounts += countURLStrings(child) 
    if 'URLString' in plistDict.keys(): 
     childURLCounts += 1 
    return childURLCounts 

BOOKMARKS_PLIST = '/Users/username/Library/Safari/Bookmarks.plist' 

with open(BOOKMARKS_PLIST, 'rb') as fp: 
    pl = plistlib.load(fp) 

countURLStrings(pl) 

Пример кода Python 2.7.6

import biplist 

def countURLStrings(plistDict): 
    childURLCounts = 0 
    if 'Children' in plistDict.keys(): 
     for child in plistDict['Children']: 
      childURLCounts += countURLStrings(child) 
    if 'URLString' in plistDict.keys(): 
     childURLCounts += 1 
    return childURLCounts 

BOOKMARKS_PLIST = '/Users/jaburaschi/Library/Safari/Bookmarks.plist' 

with open(BOOKMARKS_PLIST, 'rb') as fp: 
    pl = biplist.readPlist(fp) 

countURLStrings(pl) 
+0

Спасибо за ваш вклад (хотя я не знаю, почему вы дали мне -1; Я все еще ноб). Я попробовал второй образец кода (так как я использую anaconda v 2.2 (он использует python2.79). Не было биплиперного пакета, поэтому я установил его с помощью pip. Затем я получаю эту ошибку: – aquagremlin

+0

Файл «/ Users/me/PyProjects/pylisterP/pylister3.py ", строка 15, в pl = biplist.readPlist (fp) Файл" /Users/me/anaconda/lib/python2.7/site-packages/biplist/__init__.py ", строка 126 в readPlist повышение InvalidPlistException (е) biplist.InvalidPlistException: не хорошо сформирован (недействительный маркер): строка 1, столбец 0 – aquagremlin

+0

Сожалеем о плохом форматировании, я не могу получить новые линии или подсветку кода в комментариях – aquagremlin