Работать с Netscape Bookmark File Format на Python?

Моя закладка Chrome слишком грязная. Поэтому я экспортировал его и решил написать программу Python для очистки моей закладки. Например: сортируйте их по ключевому слову.

Я нашел Красивый суп. Но проблема в том, что файл экспорта использует Netscape Bookmark File Format, а не стандартный XML. Beautiful Soup попытается преобразовать их в стандартный формат XTML. Chrome не сможет его прочитать.

Есть ли другое решение?

2 ответа

Решение

По умолчанию Chrome хранит ваши закладки в формате JSON, например по адресу:

C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Bookmarks

Для пользователей Linux:

~/.config/chrome/Default/Bookmarks

(Местоположение этого файла, конечно, зависит от вашей платформы.)

Возможно, вам будет проще управлять этим файлом, чем экспортом в HTML.

У меня та же проблема. Сейчас я делаю Python Bookmark Toolkit только для того, чтобы убрать грязную закладку из Chrome.

Bookmarkit на github: https://github.com/allengaller/bookmarkit

Я думаю, что поиск файла закладок с помощью Chrome не поможет вам / мне. Если вы не анализируете файл JSON в Dict(я вижу, что вы открыли еще один вопрос по этому поводу, и я думаю, что вы уже оставили файл закладок SGML вместе.)

Мое решение будет:

  1. Использование CLI для управления закладками является тупиком, потому что это очень сложный процесс для людей, которым действительно нужен инструмент JUST для управления закладками (большинство из них, как и я, имеют файл закладок 10M+), я буду использовать PyGTK или PyQT, чтобы легко основанный на отбрасывании GUI.

  2. Об изменении вашего файла в BS: Забудьте об изменениях, которые BS сделает с вашим файлом закладок. Каждый раз, когда вы заканчиваете анализ файла, генерируйте файл NETSCAPE-BOOKMARK, не используя оригинальный файл (даже если он не был изменен)

  3. Попробуйте ElementTree lib.
    Смотрите здесь: http://docs.python.org/library/xml.etree.elementtree.html Я думаю, что синтаксический анализ SGML намного безопаснее, чем прямое изменение файла JSON, который использует Chrome. Поскольку такие пользователи, как я, очень серьезно относятся к нашим данным, я бы предпочел тщательно их экспортировать, импортировать в свой инструментарий, завершить работу и импортировать обратно в Chrome. Этот прогресс лучше быть явным.

Я понял, как это сделать с помощью Node.js. Просто установите cheerio (npm install -S cheerio) и добавьте имена inputFile и outputFile с помощью переменных среды или аргументов командной строки. Вот мое решение:

const fs = require('fs')
const path = require('path')
const cheerio = require('cheerio')
const inputFile = process.env.INPUT || process.argv[2] || 'bookmarks.html'
const outputFile = process.env.OUTPUT || process.argv[3] || 'bookmarks.json'
const inputFilePath = path.resolve(inputFile)
const outputFilePath = path.resolve(outputFile)

fs.readFile(inputFilePath, { encoding: 'utf8' }, (error, data) => {
  if (error)
    return console.error(error)
  const $ = cheerio.load(data)
  function parseTerm(element, out) {
    const item = {}
    if (element.name === 'dt') {
      parseTerm($(element).children(':not(p)').first().get()[0], out)
    } else if (element.name === 'h3') {
      item.title = $(element).text()
      item.type = 'folder'
      item.updated = $(element).attr('last_modified')
      item.children = []
      out.push(item)
      parseList($(element).next(), item.children)
    } else if (element.name === 'a') {
      item.title = $(element).text()
      item.type = 'link'
      item.added = $(element).attr('add_date')
      item.href = $(element).attr('href')
      item.icon = $(element).attr('icon')
      out.push(item)
    }
  }
  function parseList(list, out) {
    list.children(':not(p)').each(function (index) {
      parseTerm(this, out)
    })
  }
  const out = []
  parseList($('dl').first(), out)
  fs.writeFile(outputFilePath, JSON.stringify(out, null, 2), error => {
    if (error)
      return console.error(error)
    console.log('Success!')
  })
})
Другие вопросы по тегам