将 url 列表添加到 Qutebrowser 的 sqlite3 历史记录中

将 url 列表添加到 Qutebrowser 的 sqlite3 历史记录中

总体概述

我有一个 `history.csv url 的 CSV 文件,格式如下:

<url>;<title>;2024-03-30T12:00:00;2024-03-30T12:00:00

(这2024-03-30T12:00:00是一样的)

目标是在 sqlite3 中的 Qutebrowser 历史记录中获取此 url。

我做了什么

预先请求

首先我关闭了 Qutebrowser。

打开数据库

我跑:

sqlite3 ~/.local/share/qutebrowser/history.sqlite

添加新网址

在 sqlite3 shell 中我做了:

.mode csv
.separator ';'
.import urls.txt History

一切都很好,除了一些格式错误的行,例如:

history.csv:11671: unescaped " character
history.csv:11671: unescaped " character
history.csv:11772: expected 4 columns but found 6 - extras ignored

验证

我通过以下方式验证了更改的发生:

SELECT * FROM History;

是的,我看到了网址。

闭幕式

最后我关闭了控制台:

.quit

问题

当我回到 Qutebrowser 并尝试打开一些网址以查看它是否有效时,它不起作用。网址似乎未导入。

问题

如何将网址导入到 Qutebrowser 的历史记录中?通过我描述的方式或任何其他方式。

更新

:history当我在 Qutebrowser 中激活命令时,会出现我添加的链接。但没有出现在历史补全中。所以这不是数据库的问题。

答案1

SQLite 不强制执行列类型,cutebrowser 历史 SQL 中的时间列是简单整数(可能是自纪元以来的秒数)。您的是带有 ISO 格式日期时间的完整字符串!所以,qutebrowser 可能无法解析这些。

事实上,您的 CSV 中似乎有"或 ,;这又表明您没有正确预处理数据; URL 需要首先进行 urlencode 编码。不过,sqlite 告诉您存在未转义的引号这一事实确实是一个坏兆头;通常,它们的解析器具有一定的容忍度,并且您可能确实拥有无法明确解析为 CSV 的数据。在文本编辑器中检查这些行((neo)vim 打开具有几千行的文件应该没有任何问题)。

因此,恐怕通过sqlite3“扩展”SQL shell 直接导入它们是行不通的。用您选择的语言编写脚本应该非常简单;我这里是 python3,因为它默认内置

  • sqlite3模块,您可以使用它轻松地将行插入表中,
  • datetime对于日期转换,
  • 以及csv用于读取 CSV 文件的模块以及简单的行读取处理。我倾向于在这里手动解析,因为你似乎在意想不到的地方有引号。

我想出的程序存根大致如下

#!/usr/bin/env python3
from datetime import datetime
# Need to install python3-requests:
from requests.utils import requote_uri
import sqlite3
from sys import argv

def parseline(line: str) -> tuple:
    components = line.split(";")
    url = requote_uri(components[0])

    raw_title = components[1]
    if raw_title[0] == '"' and raw_title[-1] == '"':
        raw_title = raw_title[1:-1]
    title = raw_title

    timestamp1 = int(datetime.fromisoformat(components[-2]).timestamp())
    return (url, title, timestamp1, 0)

assert(len(argv) == 3)

with sqlite3.Connection(argv[1]) as db:
    handle = db.cursor()
    with open(argv[2], "r", encoding="utf-8") as textfile:
        handle.executemany("INSERT INTO History VALUES(?, ?, ?, ?)", 
            (parseline(line) for line in textfile))

请注意,上面的脚本完全未经测试,只是我凭空想象写的。您可以使其可执行chmod a+x scriptname并从您的目录运行它.local/share/qutebrowser,并将分号分隔的文件的路径作为参数,例如cd ~/.local/share/qutebrowser; ~/bin/scriptname ~/urls.txt

Fauve 调试

我可以运行以下脚本

#!/usr/bin/env python3
from datetime import datetime
# Need to install python3-requests:
from requests.utils import requote_uri
import sqlite3
from sys import argv

def parseline(line: str) -> tuple:
    components = line.split(";")
    url = requote_uri(components[0])

    raw_title = components[1]
    if raw_title[0] == '"' and raw_title[-1] == '"':
        raw_title = raw_title[1:-1]
    title = raw_title

    timestamp1 = int(datetime.fromisoformat(components[-2]).timestamp())
    return (url, title, timestamp1, 0)

assert(len(argv) == 3)

with sqlite3.Connection(argv[1]) as db:
    handle = db.cursor()
    with open(argv[2], "r", encoding="utf-8") as textfile:
        handle.executemany("INSERT INTO History VALUES(?, ?, ?, ?)", 
            (parseline(line) for line in textfile))

python3 importHistory.py ~/.local/share/qutebrowser/history.sqlite history.csv

在我的脚本中,您应该给出数据库路径。

相关内容