Работать с 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 вместе.)
Мое решение будет:
Использование CLI для управления закладками является тупиком, потому что это очень сложный процесс для людей, которым действительно нужен инструмент JUST для управления закладками (большинство из них, как и я, имеют файл закладок 10M+), я буду использовать PyGTK или PyQT, чтобы легко основанный на отбрасывании GUI.
Об изменении вашего файла в BS: Забудьте об изменениях, которые BS сделает с вашим файлом закладок. Каждый раз, когда вы заканчиваете анализ файла, генерируйте файл NETSCAPE-BOOKMARK, не используя оригинальный файл (даже если он не был изменен)
Попробуйте 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!')
})
})