Chromeのブックマークが乱雑です。そこで、それをエクスポートして、ブックマークをクリーンアップするPythonプログラムを作成することにしました。例:キーワードで並べ替えます。
美しいスープを見つけました。ただし、問題は、エクスポートファイルが標準のXMLではなくNetscapeブックマークファイル形式を使用していることです。Beautiful Soupは、それらを標準のXTML形式に変換しようとします。Chromeはそれを読み取ることができません。
別の解決策はありますか?
Chromeのブックマークが乱雑です。そこで、それをエクスポートして、ブックマークをクリーンアップするPythonプログラムを作成することにしました。例:キーワードで並べ替えます。
美しいスープを見つけました。ただし、問題は、エクスポートファイルが標準のXMLではなくNetscapeブックマークファイル形式を使用していることです。Beautiful Soupは、それらを標準のXTML形式に変換しようとします。Chromeはそれを読み取ることができません。
別の解決策はありますか?
デフォルトでは、ChromeはブックマークをJSONとして保存します(例:
C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Bookmarks
Linuxユーザーの場合:
~/.config/chrome/Default/Bookmarks
(もちろん、このファイルの場所はプラットフォームによって異なります。)
このファイルは、HTMLエクスポートよりも操作が簡単な場合があります。
私も同じ問題を抱えてる。現在、Chromeから厄介なブックマークを削除するためだけにPythonブックマークツールキットを実行しています。
githubでBookmarkit:https ://github.com/allengaller/bookmarkit
Chromeでブックマークファイルを見つけても役に立たないと思います。JSONファイルをDictに解析しない限り(これについて別の質問を開いたようですが、すでにSGMLブックマークファイルを残していると思います)。
私の解決策は次のとおりです。
CLIを使用してブックマークを管理するのは行き止まりです。ブックマークを管理するためだけのツールが本当に必要な人にとっては非常に難しい進歩です(ほとんどの場合、私のような1,000万以上のブックマークファイルがあります)。PyGTKまたはPyQTを使用して簡単に提供します。ドロップアンドスローベースのGUI。
BSによるファイルの変更について:BSがブックマークファイルに対して行う変更については忘れてください。ファイルの解析が終了するたびに、元のファイルを使用せずに、NETSCAPE-BOOKMARKファイルを生成します(変更されていない場合でも)
ElementTreelibを試してください。
ここを参照してください:http ://docs.python.org/library/xml.etree.elementtree.html
SGMLの解析は、Chromeが使用しているJSONファイルを直接変更するよりもはるかに安全だと思います。私のようなヘビーユーザーはデータを非常に真剣に受け止めているので、慎重にエクスポートし、Toolkitにインポートし、仕事を終えてから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!')
})
})