2

Chromeのブックマークが乱雑です。そこで、それをエクスポートして、ブックマークをクリーンアップするPythonプログラムを作成することにしました。例:キーワードで並べ替えます。

美しいスープを見つけました。ただし、問題は、エクスポートファイルが標準のXMLではなくNetscapeブックマークファイル形式を使用していることです。Beautiful Soupは、それらを標準のXTML形式に変換しようとします。Chromeはそれを読み取ることができません。

別の解決策はありますか?

4

3 に答える 3

7

デフォルトでは、ChromeはブックマークをJSONとして保存します(例:

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

Linuxユーザーの場合:

~/.config/chrome/Default/Bookmarks

(もちろん、このファイルの場所はプラットフォームによって異なります。)

このファイルは、HTMLエクスポートよりも操作が簡単な場合があります。

于 2012-08-11T11:17:44.207 に答える
2

私も同じ問題を抱えてる。現在、Chromeから厄介なブックマークを削除するためだけにPythonブックマークツールキットを実行しています。

githubでBookmarkit:https ://github.com/allengaller/bookmarkit

Chromeでブックマークファイルを見つけても役に立たないと思います。JSONファイルをDictに解析しない限り(これについて別の質問を開いたようですが、すでにSGMLブックマークファイルを残していると思います)。

私の解決策は次のとおりです。

  1. CLIを使用してブックマークを管理するのは行き止まりです。ブックマークを管理するためだけのツールが本当に必要な人にとっては非常に難しい進歩です(ほとんどの場合、私のような1,000万以上のブックマークファイルがあります)。PyGTKまたはPyQTを使用して簡単に提供します。ドロップアンドスローベースのGUI。

  2. BSによるファイルの変更について:BSがブックマークファイルに対して行う変更については忘れてください。ファイルの解析が終了するたびに、元のファイルを使用せずに、NETSCAPE-BOOKMARKファイルを生成します(変更されていない場合でも)

  3. ElementTreelibを試してください。
    ここを参照してください:http ://docs.python.org/library/xml.etree.elementtree.html SGMLの解析は、Chromeが使用しているJSONファイルを直接変更するよりもはるかに安全だと思います。私のようなヘビーユーザーはデータを非常に真剣に受け止めているので、慎重にエクスポートし、Toolkitにインポートし、仕事を終えてからChromeにインポートし直したいと思います。この進捗状況は明確である方がよいでしょう。

于 2012-10-04T14:49:33.367 に答える
0

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!')
  })
})
于 2020-09-16T01:52:36.290 に答える