使用 pyodbc 解析chrome浏览器导出的书签并保存到 Microsoft Access 数据库

使用 wxPython 和 pyodbc 解析书签并保存到 Microsoft Access 数据库的示例博客:
本篇博客介绍了如何使用 wxPython 和 pyodbc 库创建一个简单的应用程序,用于解析 HTML 文件中的书签并将其保存到 Microsoft Access 数据库中。通过这个示例,您可以学习如何使用 wxPython 构建图形用户界面,以及如何使用 pyodbc 连接和操作 Microsoft Access 数据库。
C:\pythoncode\new\bookmarkstoaccess.py

准备工作

在这里插入图片描述
在这里插入图片描述

在开始之前,请确保您已经安装了以下依赖库:

  • wxPython:用于创建图形用户界面。
  • pyodbc:用于与 Microsoft Access 数据库进行交互。
  • lxml:用于解析 HTML 文件。

初始化数据库连接

首先,我们需要初始化数据库连接。在这个示例中,我们使用 Microsoft Access 数据库作为存储书签的目标。根据您的实际情况,您需要修改 db_path 变量的值为实际的数据库文件路径。

# 数据库连接信息
db_path = r'./database1.accdb'
conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + db_path# 创建数据库连接
self.conn = pyodbc.connect(conn_str)
self.cursor = self.conn.cursor()

在上述代码中,我们使用 pyodbc.connect 方法创建一个数据库连接,并使用返回的连接对象创建一个游标(cursor)对象。游标用于执行 SQL 语句和获取查询结果。

检查表是否存在

在书签数据保存之前,我们需要检查数据库中是否存在特定的表。如果不存在,我们将使用 SQL 语句创建该表。下面是一个检查表是否存在的示例代码:

def table_exists(self, cursor, table_name):try:cursor.execute(f"SELECT TOP 1 * FROM {table_name}")return Trueexcept pyodbc.Error:return False# 检查并创建表
if not self.table_exists(self.cursor, 'bookmarks1'):self.cursor.execute("CREATE TABLE bookmarks1 (title TEXT, url TEXT, date1 TEXT, icon TEXT)")

在上述代码中,我们定义了一个 table_exists 方法,通过执行 SELECT 语句并捕获异常来判断表是否存在。如果表不存在,我们使用 CREATE TABLE 语句创建名为 'bookmarks1' 的表。

解析书签信息

接下来,我们需要解析 HTML 文件中的书签信息。在本示例中,我们使用了 lxml 库来解析 HTML 文件。以下是一个简单的解析书签的示例代码:

def parseBookmarks(self, htmlfile):with open(htmlfile, 'r', encoding='utf-8') as f:dom = lxml.html.fromstring(f.read())titles = dom.xpath('//dt/a/text()')urls = dom.xpath('//dt/a/@href')bookmarks = []for title, url in zip(titles, urls):bm = {'title': title, 'url': url}bookmarks.append(bm)return bookmarks

上述代码打开指定的 HTML 文件,使用 lxml 库解析文件内容,并提取书签的标题和链接。然后,将每个书签以字典的形式添加到 bookmarks 列表中。

保存书签到数据库

最后,我们将解析的书签信息保存到 Microsoft Access 数据库中。以下是一个简单的保存书签的示例代码:

def saveBookmarks(self, bookmarks):for bm in bookmarks:self.cursor.execute("INSERT INTO bookmarks1 (title, url) VALUES (?, ?)",(bm['title'], bm['url']))self.conn.commit()

在上述代码中,我们使用 INSERT INTO 语句将每个书签的标题和链接插入到 'bookmarks1' 表中。最后,我们通过调用 commit 方法提交事务,确保数据保存到数据库。

完整代码和运行

请注意,上述代码只是示例代码的一部分。要运行完整的示例程序,请确保已经正确导入所需的库,并在 __name__ == '__main__' 的条件下创建 wx.AppMyFrame 对象。

完整的示例代码可以在下面找到:

import wx
import pyodbc
import lxml.html
from pubsub import pub
# 其他代码不变class MyFrame(wx.Frame):def __init__(self):wx.Frame.__init__(self, parent=None, title='Bookmark Parser')self.panel = wx.Panel(self)self.open_button = wx.Button(self.panel, label='Open...')self.open_button.Bind(wx.EVT_BUTTON, self.onOpen)# self.dbname = 'database1.accdb' # 需要修改为实际的Access数据库路径self.initDB() # 初始化数据库连接        self.Show()# # 检查表是否存在的函数def table_exists(self, cursor, table_name):try:cursor.execute(f"SELECT TOP 1 * FROM {table_name}")return Trueexcept pyodbc.Error:return False             def initDB(self):# 数据库连接信息db_path = r'./database1.accdb'conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=' + db_path# 创建数据库连接self.conn = pyodbc.connect(conn_str)self.cursor = self.conn.cursor()if not self.table_exists(self.cursor, 'bookmarks1'):self.cursor.execute("CREATE TABLE bookmarks1 (title TEXT, url TEXT, date1 TEXT, icon TEXT)")        # 如果表不存在则创建表# self.cursor.execute("CREATE TABLE bookmarks1 (title TEXT, url TEXT, date1 TEXT, icon TEXT)") def onOpen(self, event):with wx.FileDialog(self, "Open HTML file", wildcard="HTML files (*.htm)|*.htm",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:return     # 用户取消选择# 用户选择了文件,获取选择的文件路径pathname = fileDialog.GetPath()# 解析HTML,提取书签信息bookmarks = self.parseBookmarks(pathname)# 写入数据库self.saveBookmarks(bookmarks)def parseBookmarks(self, htmlfile):with open(htmlfile, 'r', encoding='utf-8') as f:dom = lxml.html.fromstring(f.read())           titles = dom.xpath('//dt/a/text()')urls = dom.xpath('//dt/a/@href')bookmarks = []for title, url in zip(titles, urls):bm = {'title': title, 'url': url}bookmarks.append(bm)return bookmarks            def saveBookmarks(self, bookmarks):for bm in bookmarks:self.cursor.execute("INSERT INTO bookmarks1 (title, url ) VALUES (?, ?)",(bm['title'], bm['url']))self.conn.commit()if __name__ == '__main__':app = wx.App()frame = MyFrame()frame.Show()app.MainLoop()

请注意,在运行之前,请确保已经正确安装了所需的依赖库,并将 db_path 变量设置为您的实际数据库文件路径。

以上是一个简单的示例,展示了如何使用 wxPython 和 pyodbc 创建一个解析书签并保存到 Microsoft Access 数据库的应用程序。您可以根据自己的需求进行修改和扩展。

希望本篇博客对您有所帮助!如果您有任何问题或疑问,请随时提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ONNX版本YOLOV5-DeepSort (rknn版本已经Ready)

目录 1. 前言 2. 储备知识 3. 准备工作 4. 代码修改的地方 5.结果展示 1. 前言 之前一直在忙着写文档,之前一直做分类,检测和分割,现在看到跟踪算法,花了几天时间找代码调试,看了看,展示效果比单纯的检…

手写代码-前端面试

GitHub:手写代码集合

HTTP响应状态码大全:从100到511,全面解析HTTP请求的各种情况

文章目录 前言一、认识响应状态码1. 什么是HTTP响应状态码2. Http响应状态码的作用3. 优化和调试HTTP请求的建议 二、1xx 信息响应1. 认识http信息响应2. 常见的信息响应状态码 三、2xx 成功响应1. 认识HTTP成功响应2. 常见的成功响应状态码 四、3xx 重定向1. 认识http重定向2.…

QT如何打包

目录 1.windeployqt工具 2.工具位置 3.使用方法 4.注意事项 Qt Creator 默认以动态链接的方式生成可执行文件,该文件无法独立运行,必须为其提供所需的动态链接库。也就是说,只分享 Qt Creator 生成的可执行文件是不行的,必须将…

nginx部署时http接口正常,ws接口404

可以这么配置 map $http_upgrade $connection_upgrade {default upgrade; close; }upstream wsbackend{server ip1:port1;server ip2:port2;keepalive 1000; }server {listen 20038;location /{ proxy_http_version 1.1;proxy_pass http://wsbackend;proxy_redirect off;proxy…

什么是字体堆栈(font stack)?如何设置字体堆栈?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是字体堆栈(Font Stack)?⭐ 如何设置字体堆栈?⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 …

【卷积神经网络】卷积,池化,全连接

随着计算机硬件的升级与性能的提高,运算量已不再是阻碍深度学习发展的难题。卷积神经网络(Convolution Neural Network,CNN)是深度学习中一项代表性的工作,CNN 是受人脑对图像的理解过程启发而提出的模型,其…

【分类讨论】CF1674 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 样例&#xff1a; 这种分类讨论的题&#xff0c;主要是去看答案的最终来源是哪几种情况&#xff0c;这几种情况得不重不漏 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 lon…

浅谈5G技术会给视频监控行业带来的一些变革情况

5G是第五代移动通信技术&#xff0c;能够提供更高的带宽和更快的传输速度&#xff0c;这将为视频技术的发展带来大量机会。随着5G技术的逐步普及与商用&#xff0c;人们将能够享受到更加流畅的高清视频体验&#xff0c;并且5G技术还拥有更低的延迟和更高的网络容量。这些优势不…

2023牛客暑期多校训练营9-B Semi-Puzzle: Brain Storm

2023牛客暑期多校训练营9-B Semi-Puzzle: Brain Storm https://ac.nowcoder.com/acm/contest/57363/B 文章目录 2023牛客暑期多校训练营9-B Semi-Puzzle: Brain Storm题意解题思路代码 题意 解题思路 欧拉定理 a b ≡ { a b % φ ( p ) g c d ( a , p ) 1 a b g c d ( a ,…

GBU812-ASEMI新能源专用整流桥GBU812

编辑&#xff1a;ll GBU812-ASEMI新能源专用整流桥GBU812 型号&#xff1a;GBU812 品牌&#xff1a;ASEMI 封装&#xff1a;GBU-4 恢复时间&#xff1a;&#xff1e;50ns 正向电流&#xff1a;80A 反向耐压&#xff1a;1200V 芯片个数&#xff1a;4 引脚数量&#xff…

Linux系统调试——valgrind内存泄露检测

代码可能存在内存泄露怎么办&#xff1f; 使用valgrind可以对代码进行内存泄露检测。 valgrind下载安装 下载&#xff1a;https://www.valgrind.org/downloads/ 安装&#xff1a; 1、tar –jxvf valgrind-3.21.0.tar.bz2 2、cd valgrind-3.21.0 3、./configure --prefix/ho…

Springboot 实践(7)springboot添加html页面,实现数据库数据的访问

前文讲解&#xff0c;项目已经实现了数据库Dao数据接口&#xff0c;并通过spring security数据实现了对系统资源的保护。本文重点讲解Dao数据接口页面的实现&#xff0c;其中涉及页面导航栏、菜单栏及页面信息栏3各部分。 1、创建html页面 前文讲解中&#xff0c;资源目录已经…

使用爱校对提升公文材料准确性的必要性

在我们的工作中&#xff0c;公文材料的准确性往往决定了我们的工作效果。无论是内部的报告、计划&#xff0c;还是外部的公告、通知&#xff0c;都需要准确无误才能达到我们预期的效果。为此&#xff0c;我们需要使用强大的工具——爱校对&#xff0c;来提升公文材料的准确性。…

SpringBoot整合Shiro实现登录认证,鉴权授权

文章目录 前言一、shiro简介二、环境搭建2.1.数据库2.1.1user用户表2.1.2user_role用户角色关系表2.1.3role角色表2.1.4role_permission角色权限关系表2.1.5permission权限表 2.2导坐标2.3实体类2.3.1User2.3.2Role2.3.3Permission 2.4MVC三层2.4.1User2.4.1.1mapper层2.4.1.2s…

Git 删除 GitHub仓库的文件

新建文件夹 git bash here 在新建的文件夹里右键git bash here打开终端&#xff0c;并执行git init初始化仓库 git clone <你的地址> 找到github上要删除的仓库地址&#xff0c;并复制&#xff0c;在终端里输入git clone <你的地址> 要删除文件的库里右键git b…

归并排序(C++ mpi 并行实现)

文章目录 主要思路1. 串行归并排序2. 进程的分发3. 对接收到的子数组进行排序4. 合并数组5.输出排序后的数组6.进程分发部分的优化7.完整代码 主要思路 我们首先实现串行的归并排序&#xff1b;实现进程的分发&#xff1b;排序其中的每个子部分&#xff1b;进程的合并通信&…

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 语言中 slice 的性质对于编程非常有益。下面&#xff0c;我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 2 篇&#xff0c;当切片的容量 cap 不够时 func main() {// slice1 当前长度为 3&#xff0c;容量大小也为 3slice1 :…

.netcore grpc的proto文件字段详解

一、.proto文件字段概述 grpc的接口传输参数都是根据.proto文件约定的字段格式进行传输的grpc提供了多种类型字段&#xff1b;主要包括标量值类型&#xff08;基础类型&#xff09;、日期时间、可为null类型、字节、列表、字典、Any类型&#xff08;任意类型&#xff09;、One…

前端笔试+面试分享

以下是个人线下面试遇到的真实的题&#xff0c;仅供参考和学习 1. css 选择符有哪些&#xff1f;哪些属性可以继承&#xff1f;优先级算法加何计算&#xff1f; CSS选择符有很多种&#xff0c;例如类型选择器、类选择器、ID选择器、属性选择器、伪类选择器、伪元素选择器等。 …